버킷 테이블 생성과 채우기

버킷 테이블 생성과 채우기 (LanguageManual DDL BucketedTables)

버킷(bucketed) 테이블은 비버킷 테이블보다 훨씬 효율적인 sampling을 가능하게 하고, 나중에는 mapside join 같은 시간을 절약하는 연산에도 도움을 주는 멋진 기능이에요. 다만 테이블 생성 시 지정한 버킷팅이 데이터를 쓸 때 강제되지 않기 때문에, 메타데이터가 실제 레이아웃과 어긋나지 않도록 올바르게 채우는 방법을 알아두는 게 중요하답니다.

출처: 문서

본문

버킷 테이블을 생성하고 채우는 간단한 예제예요. (또 다른 예제는 Bucketed Sorted Tables를 참고해요.)

버킷 테이블은 비버킷 테이블보다 훨씬 효율적인 sampling을 가능하게 하고, 나중에는 mapside join 같은 시간을 절약하는 연산을 가능하게 해주는 훌륭한 기능이에요. 하지만 테이블 생성 시 지정한 버킷팅은 테이블에 write할 때 강제되지 않으므로, 테이블의 메타데이터가 실제 레이아웃에 부합하지 않는 속성을 광고할 가능성이 있어요. 이는 당연히 피해야 해요. 올바르게 하는 방법은 다음과 같아요.

먼저, 테이블 생성:

CREATE TABLE user_info_bucketed(user_id BIGINT, firstname STRING, lastname STRING)
COMMENT 'A bucketed copy of user_info'
PARTITIONED BY(ds STRING)
CLUSTERED BY(user_id) INTO 256 BUCKETS;

버킷팅의 기준이 될 컬럼(user_id)을 지정한다는 점에 주목해요.

그런 다음 테이블을 채워요:

set hive.enforce.bucketing = true;  -- (참고: Hive 2.x 이상에서는 필요 없음)
FROM user_id
INSERT OVERWRITE TABLE user_info_bucketed
PARTITION (ds='2009-02-25')
SELECT userid, firstname, lastname WHERE ds='2009-02-25';

버전 0.x와 1.x만 해당

set hive.enforce.bucketing = true; 명령은 테이블을 기반으로 올바른 수의 리듀서와 cluster by 컬럼을 자동으로 선택할 수 있게 해줘요. 그렇지 않으면 set mapred.reduce.tasks = 256;처럼 리듀서 수를 버킷 수와 같게 설정하고, select에 CLUSTER BY ... 절을 넣어야 해요.

Hive는 어떻게 행을 버킷에 분배할까요? 일반적으로 버킷 번호는 hash_function(bucketing_column) mod num_buckets 표현식으로 결정돼요. (여기엔 '0x7FFFFFFF도 있지만 그건 그리 중요하지 않아요.) hash_function은 버킷팅 컬럼의 타입에 따라 달라져요. int라면 간단해요, hash_int(i) == i예요. 예를 들어 user_id가 int이고 버킷이 10개라면, 0으로 끝나는 모든 user_id는 버킷 1, 1로 끝나는 모든 user_id는 버킷 2가 되는 식으로 기대할 수 있어요. 다른 데이터 타입은 조금 까다로워요. 특히 BIGINT의 해시는 BIGINT와 같지 않아요. 그리고 문자열이나 복합 데이터 타입의 해시는 값에서 유도된 어떤 숫자겠지만 사람이 알아볼 수 있는 형태는 아니에요. 예를 들어 user_id가 STRING이라면 버킷 1의 user_id가 0으로 끝나지 않을 가능성이 높아요. 일반적으로 해시를 기반으로 행을 분배하면 버킷에 고르게 분포돼요.

그럼 무엇이 잘못될 수 있을까요? 위 문법과 set hive.enforce.bucketing = true(Hive 0.x와 1.x용)를 사용하는 한 테이블은 제대로 채워져야 해요. 버킷팅 컬럼 타입이 insert할 때와 read할 때 다르거나, 테이블 정의와 다른 값을 수동으로 cluster by하면 문제가 생길 수 있어요.

더 알아보기 (Learn more)

  • Bucketed Sorted Tables 예제를 더 살펴볼 수 있어요.
  • sampling 문서에서 버킷 테이블을 활용한 샘플링 방법을 확인할 수 있어요.