EXCELSIOR

하이브 조인(Hive Join) 본문

DataBase/Hadoop

하이브 조인(Hive Join)

Excelsior-JH 2016. 11. 30. 18:30

맵리듀스로 조인을 구현하려면 몇십 줄의 클래스를 작성해야하지만, 하이브를 이용하면 쿼리문을 통해 간단하게 조인을 할 수 있다.

단, 다음의 제약사항이 있다.

  • 하이브는 EQ조인만 지원한다. EQ조인은 두 테이블 대상으로 동일성을 비교한 후, 그 결과를 기준으로 조인하는 것이다. 이 조인에서는 조인 서술자로 등호(=)만 사용할 수 있다.
  • 하이브는 FROM 절에 테이블 하나만 지정할 수 있고, ON 키워드를 사용해 조인을 처리해야 한다.
이번 포스팅에서는 교재에 나와있는대로 하이브의 조인 기능을 사용해 항공 운항 지연 데이터와 항공사 코드 테이블을 조인해 볼 것이다.

먼저, 항공사 코드 데이터를 저장하기 위한 테이블을 생성한다. (항공사 코드 데이터는 http://stat-computing.org/dataexpo/2009/carriers.csv에서 다운로드 받을 수 있다.)
hive> CREATE TABLE carrier_code(Code STRING, Description STRING)
    > ROW FORMAT DELIMITED
    > FIELDS TERMINATED BY ','
    > LINES TERMINATED BY '\n'
    > STORED AS TEXTFILE;
OK
Time taken: 1.073 seconds

테이블이 생성되면 다음과 같이 데이터를 업로드 한다.

hive> LOAD DATA LOCAL INPATH '/usr/local/hadoop2/study/carriers.csv'
    > OVERWRITE INTO TABLE carrier_code;
Loading data to table default.carrier_code
OK
Time taken: 1.998 seconds


1. 내부 조인(INNER JOIN)

항공 운항 지연 테이블과 항공사 코드 테이블을 항공 운항 지연 테이블의 UniqueCarrier과 항공사 코드 테이블의 Code, 즉 항공사 코드로 내부 조인을 한다. 각각의 테이블의 별칭(Alias)를 A, B로 사용하였다. 

하이브QL도 SQL 처럼 테이블 alias을 지원한다. 하지만 alias앞에 AS 키워드를 추가하면 오류가 발생하므로 사용할 때 주의해야 한다.

hive> SELECT A.Year, A.UniqueCarrier, B.Description, COUNT(*)
    > FROM airline_delay A
    > JOIN carrier_code B ON (A.UniqueCarrier = B.Code)
    > WHERE A.ArrDelay > 0 and A.month = 1
    > GROUP BY A.Year, A.UniqueCarrier, B.Description;

OK
a.year  a.uniquecarrier b.description   c3
2008    B6      JetBlue Airways 6603
2008    EV      Atlantic Southeast Airlines     10267
2008    FL      AirTran Airways Corporation     9681
2008    MQ      American Eagle Airlines Inc.    20336
2008    NW      Northwest Airlines Inc. 16325
2008    OH      Comair Inc.     8748
2008    UA      United Air Lines Inc.   20427
2008    AA      American Airlines Inc.  27112
2008    AS      Alaska Airlines Inc.    5662
2008    CO      Continental Air Lines Inc.      12630
2008    DL      Delta Air Lines Inc.    15509
2008    HA      Hawaiian Airlines Inc.  997
2008    OO      Skywest Airlines Inc.   24881
2008    9E      Pinnacle Airlines Inc.  10350
2008    AQ      Aloha Airlines Inc.     963
2008    F9      Frontier Airlines Inc.  4112
2008    US      US Airways Inc. (Merged with America West 9/05. Reporting for both starting 10/07.)     14828
2008    WN      Southwest Airlines Co.  44143
2008    XE      Expressjet Airlines Inc.        16351
2008    YV      Mesa Airlines Inc.      9502
Time taken: 30.339 seconds, Fetched: 20 row(s)


2. 외부 조인(OUTER JOIN)

외부조인을 테스트하기 위해 항공사 코드에서 일부 항공사 코드를 삭제한다. 'carriers.csv'파일의 1389번째 행을 다음과 같이 삭제한다.

sed -e '1389d' carrier.csv > carriers_new.csv

그런 다음 하이브 메타스토어 데이터베이스에 항공사 코드 테이블을 추가로 생성한뒤  데이터를 업로드한다.

hive> CREATE TABLE carrier_code2(Code STRING, Description STRING)
    > ROW FORMAT DELIMITED
    > FIELDS TERMINATED BY ','
    > LINES TERMINATED BY '\n'
    > STORED AS TEXTFILE;
OK
Time taken: 1.073 seconds


hive> LOAD DATA LOCAL INPATH '/usr/local/hadoop2/study/carriers_new.csv'
    > OVERWRITE INTO TABLE carrier_code2;
Loading data to table default.carrier_code
OK
Time taken: 1.998 seconds

이제 LEFT JOIN쿼리를 입력하여 외부 조인을 한다.

hive> SELECT A.Year, A.UniqueCarrier, B.Code, B.Description
    > FROM airline_delay A
    > LEFT OUTER JOIN carrier_code2 B ON (A.UniqueCarrier = B.Code)
    > WHERE A.UniqueCarrier = 'WN'
    > LIMIT 10;

OK
a.year  a.uniquecarrier b.code  b.description
2008    WN      NULL    NULL
2008    WN      NULL    NULL
2008    WN      NULL    NULL
2008    WN      NULL    NULL
2008    WN      NULL    NULL
2008    WN      NULL    NULL
2008    WN      NULL    NULL
2008    WN      NULL    NULL
2008    WN      NULL    NULL
2008    WN      NULL    NULL
Time taken: 22.968 seconds, Fetched: 10 row(s)
Comments