[HIVE] HIVE JOIN
JOIN
-- 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