셔플조인
셔플 조인은 셔플(Shuffle) 단계에서 조인을 처리합니다. 두 개의 테이블을 조인할 때 각 테이블을 맵(Map) 단계에서 읽고, 파티션 키를 조인 키로 설정하여 셔플 단계에서 조인 키를 기준으로 리듀서로 데이터가 이동되고 테이블을 조인합니다.
어떤형태의 데이터 크기와 구성에도 사용 가능
가장 자원을 많이 사용하고 느린 조인 방식
맵조인
맵 조인은 두 개의 테이블을 조인할 때 하나의 테이블이 메모리에 로드 되어 처리됩니다. 따라서 하나의 테이블이 메모리에 올라갈 수 있을 정도로 작을 때 맵조인을 적용할 수 있습니다. hive.auto.convert.join이 true일 때 적용되고 hive.auto.convert.join.noconditionaltask.size이 메모리에 올릴 테이블의 기본 사이즈로 10MB으로 설정되어 있습니다.
셔플 조인에 비하여 빠른 속도로 처리할 수 있음
테이블이 메모리에 올라갈 수 있는 크기여야 함
-- 맵조인 적용을 위한 설정. 기본 10MB로 설정
set hive.auto.convert.join=true;
set hive.auto.convert.join.noconditionaltask.size=10000000;
SMB 조인
SMB 조인은 조인 테이블이 버켓팅 되어 있을 때 사용할 수 있습니다. 버켓팅된 키의 정보를 이용하여 빠르게 조인을 처리할 수 있습니다. 어떤 크기의 테이블에서도 가장 빠른 속도로 조인을 처리할 수 있습니다.
테이블이 버켓팅이 되어 있어야 함
-- SMB 조인을 위한 설정
set hive.auto.convert.sortmerge.join=true;
set hive.optimize.bucketmapjoin=true;
set hive.optimize.bucketmapjoin.sortedmerge=true;
하이브에서 조인을 처리할때, 마지막 테이블을 가장 크다고 가정한다. 다른 테이블을 버퍼링하려고 시도하고, 각 레코드에 대해서 조인을 수행하면서 마지막 테이블을 흘려보낸다. 그러므로 조인쿼리를 구성할때, 가장 큰 테이블을 가장 마지막에 위치하도록 해야한다. 가장 큰 테이블을 쿼리의 마지막에 위치하지 못하였더라도 힌트를 사용하면 마지막에 처리할 수 있다. 아래 스크립트는 힌트를 사용하여 from의 첫 테이블을 마지막에 처리할 수 있도록 한다.
left outer join보다는 inner join을 쓴다.
count(distinct ..)는 inner view의 group by로 푼다
불필요한 null, '' 등을 미리 제거한다!