Kudu 1.17 부터 range 파티션마다 테이블 공통 해시 스키마와 다른 버킷 수를 줄 수 있다. Cloudera 빌드 1.17.0.7.4.1.0-197 에서 이 문법으로 테이블을 만들다 range partition lower bound must be less than the upper bound: "A" <= VALUES < "A" 오류를 만난 과정과, 공식 문서로 확인한 정확한 문법, Kudu CLI 우회 방법을 정리한다.
테이블 레벨 파티션 스펙과 각 PARTITION 절 사이에 콤마를 쓰지 않는다. 해시 레벨 수는 모든 range 에서 같아야 한다.
CREATE TABLE master.new_part (
gbm STRING NOT NULL, section STRING NOT NULL, salesid STRING NOT NULL,
item STRING NOT NULL, siteid STRING NOT NULL, `check` STRING NOT NULL,
PRIMARY KEY (gbm, section, salesid, item, siteid)
)
PARTITION BY HASH (salesid, item) PARTITIONS 12
RANGE (gbm)
(
PARTITION 'A' <= VALUES < 'B'
PARTITION 'B' <= VALUES < 'C'
HASH (salesid, item) PARTITIONS 3
PARTITION 'C' <= VALUES < 'D'
HASH (salesid, item) PARTITIONS 3
)
STORED AS KUDU;
SHOW HASH SCHEMA master.new_part 또는 kudu table describe 로 확인한다.PARTITION VALUE = 'A' 단일값 표기와 range 별 해시를 함께 쓰면 상·하한이 같은 값으로 Kudu 에 넘어가는 문제가 있었으므로 'A' <= VALUES < 'B' 처럼 경계를 직접 쓴다. 이 경우 'A1', 'AB' 도 A 파티션에 들어가므로 gbm 이 한 글자 코드일 때만 안전하다.RANGE (gbm) () 처럼 range 를 비워 두는 문법은 없다. 최소 1개 파티션이 필요하다.Impala 에서 같은 오류가 계속 나면 첫 range 만 Impala 로 만들고 나머지는 클러스터 리눅스 노드에서 CLI 로 추가한다.
kudu table add_range_partition m1:7051,m2:7051,m3:7051 impala::master.new_part \
'["B"]' '["C"]' \
--hash_schema='{"hash_schema": [{"columns": ["salesid","item"], "num_buckets": 3}]}'
kudu table describe m1:7051,m2:7051,m3:7051 impala::master.new_part
경계는 JSON 배열이고 하한 포함·상한 미포함이 기본이다. --help 로 hash_schema 플래그가 있는지 먼저 확인한다. Impala 에서 만든 테이블의 Kudu 상 이름은 impala::<db>.<table> 이다.
kudu table add_column 으로 삭제한 컬럼을 다시 추가하는 것이다. 운영 적용 전 테스트 테이블로 CREATE → 적재 → ALTER 를 확인한다.