[HIVE] HIVE JOIN

JOIN

  • 하이브는 등가조인1만 지원
  • 비등가 조인2은 맵리듀스 작업이 어려워 지원 안됨
-- join Syntax
join_table:
    table_reference [INNER] JOIN table_factor [join_condition]
  | table_reference {LEFT|RIGHT|FULL} [OUTER] JOIN table_reference join_condition
  | table_reference LEFT SEMI JOIN table_reference join_condition
  | table_reference CROSS JOIN table_reference [join_condition] (as of Hive 0.10)

table_reference:
      table_factor
    | join_table

table_factor:
      tbl_name [alias]
    | table_subquery alias
    | ( table_references )

join_condition:
      ON expression
  • 암묵적 조인 (Implicit join) 하이브 0.13.0부터 지원
-- 암묵적 조인은 join 키워드 없이 테이블을 , 로 조인
SELECT *
  FROM table1 t1, table2 t2, table3 t3
 WHERE t1.id = t2.id AND t2.id = t3.id AND t1.zipcode = '02535';
  • HDFS의 데이터를 처리하기 위해 맵리듀스 작업이 생성되며 각 작업은 stage라고 부름
  • 큰테이블은 조인문 오른쪽에 두는것을 추천, 이유는 JOIN문의 테이블이 리듀서의 버퍼에 쌓이는데 여러 JOIN문의 마지막 테이블이 리듀서를 통해 스트림 되기 때문
-- 스트림될 테이블을 힌트로 명세 할수 도 있음    
SELECT /*+ STREAMTABLE(a) */
       a.val
     , b.val
     , c.val
  FROM a
  JOIN b ON (a.key = b.key1)
  JOIN c ON (c.key = b.key1)

INNER JOIN, OUTER JOIN(LEFT OUTER JOIN, RIGHT OUTER JOIN, FULL OUTER JOIN), CROSS JOIN

  • 조인은 sql의 사용법과 비슷
-- JOIN은 OUTER JOIN과 같음
SELECT a.* FROM a JOIN b ON (a.id = b.id)
SELECT a.val, b.val, c.val
  FROM a
  JOIN b ON (a.key = b.key1)
  JOIN c ON (c.key = b.key2)
-- 오른쪽 테이블 b에 일치하는 로우가 없다면 null리턴
SELECT a.val, b.val
  FROM a
  LEFT OUTER JOIN b ON (a.key=b.key)

MAP JOIN

  • 리듀스 작업없이 맵작업만 하는 JOIN
  • 리듀스가 없기 때문에 성능 개선 됨
  • 비등가 조인에 사용될 수 있음
-- 기본값을 맵조인으로 설정
set hive.auto.convert.join=true;

-- 힌트로 MAPJOIN 명시
SELECT /*+ MAPJOIN(b) */
       a.key
     , a.value
  FROM A a  
  JOIN B b ON a.key = b.key

제한사항 (다음을 지원하지 않음)

  • Lateral View 뒤에 MapJoin 사용
  • Group By/Join/Sort By/Cluster By/Distribute By 뒤에 MapJoin 사용
  • MapJoin 뒤에 Union, Join, 다른 MapJoin 사용

References

https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Joins#LanguageManualJoins-JoinSyntax
https://www.tutorialspoint.com/hive/hiveql_joins.htm


각주

  1. 등가 조인(Equi Join): 조인 조건에 등호(=)를 사용하는 조인 

  2. 비등가 조인(Non-Equi Join): 조인 조건에 부등호(>,<, BETWEEN A AND B…)를 사용하는 조인