Hive JOIN 및 조인 최적화
Hive JOIN 및 조인 최적화
· Version : Hive
Hive는 RDBMS와 같은 JOIN(조인) 구문을 제공하며 기능도 거의 유사하지만 동등조인(EQUI-JOIN)만 제공한다.
내부조인(INNER JOIN)의 경우 조인하는 모든 테이블에서 일치하는 레코드만 반환한다. ON 절은 두 테이블에서 조인할 레코드의 조건을명시한다.
select a.col_1, b.col_2 from tbl_a inner join tbl_b on a.col_1 = b.col_1 |
RDBMS의 표준 SQL의 경우 조인 키에 대해서 비동등 조인(NON-EQUI-JOIN)을 허용하지만 하이브에서는 제공하지 않는다. 또한 하이브에서는 ON절에서 OR 조건의 사용을 허용하지 않는다. 만약 ON 절에 OR를 사용하려고 한다면 아래 스크립트와 같이 UNION ALL으로 쿼리를 풀어서 사용할 수 있다.
select * from test1 as t1 join test2 as t2 on (t1.col1 = t2.col1 and t1.col1 = 1) or (t1.col1 = t2.col2 and t1.col1 = 2);
/* OR 대신 UNION ALL 사용 */ select * from test1 as t1 join test2 as t2 on (t1.col1 = t2.col1 and t1.col1 = 1)
union all
select * from test1 as t1 join test2 as t2 on (t1.col1 = t2.col2 and t1.col1 = 2); |
대부분의 하이브는 조인할 각각의 쌍에 대해서 별도의 맵리듀스 잡을 사용한다. 또한 하이브는 왼쪽에서 오른쪽으로 쿼리를 처리하며 조인 순서 또한 왼쪽에서 오른쪽(from 절 순서)으로 처리한다. 3개 이상의 테이블을 조인할 때, 모든 ON 절에서 같은 조인키를 사용한다면 하나의 맵리듀스 잡을 사용한다.
하이브에서 조인을 처리할때, 마지막 테이블을 가장 크다고 가정한다. 다른 테이블을 버퍼링하려고 시도하고, 각 레코드에 대해서 조인을 수행하면서 마지막 테이블을 흘려보낸다. 그러므로 조인쿼리를 구성할때, 가장 큰 테이블을 가장 마지막에 위치하도록 해야한다. 가장 큰 테이블을 쿼리의 마지막에 위치하지 못하였더라도 힌트를 사용하면 마지막에 처리할 수 있다. 아래 스크립트는 힌트를 사용하여 from의 첫 테이블을 마지막에 처리할 수 있도록 한다.
SELECT /*+ STREAMTABLE(s) */ s.*, b.* from tbl_s inner join tbl_b ON s.col_1 = b.col_1 where s.col_1 = ? |
데이터 조회시 검색 최적화를 위해 파티션 필터를 사용하는데 OUTER JOIN (외부조인)의 경우 파티션 필터를 무시한다. 하지만 내부 조인의 ON절에 파티션 필터를 사용하면 잘 동작한다. 따라서 모든 조인에서 파티션 필터를 사용하기 위해 중첩 SELECT를 사용하여 해결할 수 있다.
select a.col_1, b.col_1 from (select * from tbl_a where partition_filter = ? and col_1 = ?) as a left outer join (select * from tbl_b where partition_filter = ? and col_1 = ?) as b on a.col_1 = b.col_1 |
중첩 SELECT 문은 데이터 조인 전에 파티션 필더를 적용하는데 필요한 푸시다운(push down)을 수행한다. 하이브는 조인을 수행한 후에 WHERE 절을 평가한다. 따라서 WHERE 절은 NULL이 되지 않는 컬럼값에 대해서만 필터를 적용할 수 있도록 해야한다.
2020-07-22 / Sungwook Kang / http://sungwookkang.com
Hadoop, Big Data, 하둡, 빅데이터, 데이터분석, HDFS, 하둡 파일 시스템, Hive, 하이브, 하이브쿼리, HiveSQL, JOIN, INNER JOIN, 하이브 최적화, 하이브 튜닝, Hive Tuning, Hive Query Hint