필요한 개념
1) Map join
특정 테이블의 데이터가 메모리에 모두 들어갈 수 있을 정도의 크기이면
(설정: hive.mapjoin.bucket.cache.size)
하이브는 각 매퍼에서 조인을 수행할 수 있도록 모든 데이터를 메모리에 로드한다.
이 쿼리 실행 잡은 레듀서가 필요없다.
right join, full outer join에서는 제대로 작동하지 않는다.
일치의 부재는 전체 입력을 대상으로 집계(리듀스)를 수행하는 과정에서만 탐지할 수 있기 때문이다..
-> 결국 버킷 테이블/아닌테이블이 맵조인을 수행했을 때 이 쿼리의 집계결과에서 데이터 불일치가 발견되는 것은
집계 (리듀스) 수행과정에서만 탐지할 수 있기 때문이군..
왼쪽 테이블의 버킷을 처리하는 맵퍼는 조인을 수행할 때 테이블의 관련 버킷만 불러오면 된다.
맵 조인을 사용하려면 다음과 같이 최적화 설정을 활성화 해두어야한다.
set hive.optimize.bucketmapjoin = true;
2) Bucket
테이블을 버킷으로 구조화하는 이유
-효율적인 쿼리가 가능하다. 버킷팅은 테이블에 대한 추가 구조를 부여하여 버킷된 테이블 끼리 맵조인 수행시 효율적이다.
-효율적인 샘플링에 유리하다.
CREATE TABLE bucketed_users (id int, name string)
CLUSTERED BY (id) INTO 4 BUCKETS;
하이브는 아이디를 해싱하고 그 값을 버킷수 4개로 나눈 나머지를 버킷의 번호로 선택.
3) 설정값
ambari > hive > configs >advanced
hive.auto.convert.join = False
hive.auto.convert.join.noconditionaltask = true
hive.optimize.bucketmapjoin.sortedmerge = False
hive.auto.convert.join.noconditionaltask.size =
hive.convert.join.bucket.mapjoin.tez = False
hive.mapjoin.bucket.cache.size = 10000
hive.optimize.bucketmapjoin = true
hive.enforce.sortmergebucketmapjoin = true
hive.optimize.bucketmapjoin.sortedmerge = False
데이터 누락 확인 상황
-Bucket 테이블과 Bucket 아닌 테이블간의 조인시 조인이 제대로 되지 않음.
-select * bucket table join unbucket table on id 로 조인을 시도하면,
조인 결과 count(*)시 아래 모두 개수는 동일함.
버킷 테이블, 버킷 아닌 테이블 mapjoin한 결과 - case1
버킷 아닌 테이블, 버킷 아닌 테이블 map join한 결과 - case2
버킷 테이블, 버킷 테이블 map join한 결과 - case3
-하지만 버킷 테이블을 생성할 때 clustered by (column) 으로 지정한 조인 컬럼에 특정 값으로 조회를 하면 join한 전체 결과 count(*), select * 해보면 case2,3에서는 조회되지만 case1에서는 조회되지 않음
결국에 버킷 테이블은 버킷 테이블끼리 map join을 해야지 clustered by 된 컬럼을 기준으로 조인 결과 조회가 정상적으로 되는 것같다.
'Hadoop > 처리: Hive SQL' 카테고리의 다른 글
view, index (0) | 2021.07.04 |
---|