'기본'조인은 셔플 조인입니다. 공통 가입으로. JoinOperator.java을 참조하십시오. M/R 셔플을 사용하여 데이터를 분할하고 결합은 축소면에서 수행됩니다. 셔플 중 데이터 크기 복사가 그렇듯이 속도가 느립니다.
더 나은 옵션은 MapJoin입니다 (MapJoinOpertator.java 참조). 이것은 하나의 큰 테이블과 하나 이상의 작은 테이블 (예 : 일반적인 스타 스키마)에 조인 할 경우에만 작동합니다. 작은 테이블을 먼저 스캔하고 해시 테이블을 작성하여 HDFS 캐시에 업로드 한 다음 한 테이블 (큰 테이블) 만 분할하면되는 M/R 작업이 시작됩니다. 셔플 조인보다 훨씬 효율적이지만 M/R 맵 작업의 메모리에 맞추기 위해 작은 테이블이 필요합니다. 일반적으로 하이브 (적어도 0.11 이후)는 MapJoin을 사용하려고 시도하지만 config에 따라 다릅니다.
특수 결합은 버킷 정렬 병합 조인입니다. SMBJoin, SMBJoinOperator.java 참조. 이 작업은 조인 키의 버킷과 일치하는 2 개의 큰 테이블이있는 경우 작동합니다. M/R 작업 스플릿은 정렬 작업을 통해 해시 테이블을 사용하여 조인을 수행 할 수 있도록 조인 키의 오버랩을 보장하는 두 개의 큰 테이블에서지도 작업을 조율 할 수 있도록 정렬 할 수 있습니다.
메모리 부족 조건에서 스큐 조인 (skew join) 지원 및 폴백 (fallback)과 같은 자세한 내용이 있지만 사용자의 요구를 조사하기 시작해야 할 것입니다.
조인 주제에 대한 매우 훌륭한 설명은 Join Strategies in Hive입니다. 모든 것이 빠르게 진화한다는 것을 염두에 두십시오. 2011 년부터는 약간 구형입니다.
어떤 하이브 버전입니까? 어느 구성에서 (예 :'hive.auto.convert.join' true 또는 false입니까?) –
하이브 0.12.0. hive.auto.convert.join을 true로 설정하십시오. – Ace