[hive] JOIN

rerun.life·2021년 5월 15일
0

셔플조인
셔플 조인은 셔플(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;

https://wikidocs.net/83198

하이브에서 조인을 처리할때, 마지막 테이블을 가장 크다고 가정한다. 다른 테이블을 버퍼링하려고 시도하고, 각 레코드에 대해서 조인을 수행하면서 마지막 테이블을 흘려보낸다. 그러므로 조인쿼리를 구성할때, 가장 큰 테이블을 가장 마지막에 위치하도록 해야한다. 가장 큰 테이블을 쿼리의 마지막에 위치하지 못하였더라도 힌트를 사용하면 마지막에 처리할 수 있다. 아래 스크립트는 힌트를 사용하여 from의 첫 테이블을 마지막에 처리할 수 있도록 한다.

left outer join보다는 inner join을 쓴다.

  • outer join보다는 inner join이 성능이 더 좋단다.

count(distinct ..)는 inner view의 group by로 푼다

불필요한 null, '' 등을 미리 제거한다!

  • group by용 키의 값이 null, '' 등인 경우는 대부분쓸데없다.
  • 그런데 ''인 값이 매핑되는 경우가 무수히 많을 경우 reducer 하나가 이 값을 처리해야 해서 느려질 수 있다.
  • 꼭 필요한 경우가 아니면 group by 속성의 null, '' 등은 미리 where 조건에서 filter out 시키자.
profile
신나는인생

0개의 댓글