Impala 는 Kudu 테이블에 대한 CREATE TABLE AS SELECT 를 지원한다. 다만 기본키와 파티션은 자동으로 따라오지 않으므로 문에 명시해야 한다.
CREATE TABLE new_kudu_table
PRIMARY KEY (id)
PARTITION BY HASH (id) PARTITIONS 8
STORED AS KUDU
AS SELECT id, name, age FROM existing_kudu_table;
PRIMARY KEY 절에 적은 컬럼은 SELECT 결과에서 가장 앞에 와야 한다. 순서가 어긋나면 분석 단계에서 오류가 난다.
컬럼 이름을 바꾸면서 옮길 때는 별칭을 쓰되, 기본키 컬럼이 앞에 오도록 SELECT 목록을 정렬한다.
CREATE TABLE tblB
PRIMARY KEY (col2, colA)
PARTITION BY HASH (col2, colA) PARTITIONS 6
STORED AS KUDU
AS SELECT col2, col1 AS colA, col3, col4 FROM tblA;
CTAS 가 제약에 걸리는 상황(복잡한 파티션 구성, 컬럼 속성 지정)에서는 테이블을 먼저 만들고 데이터를 넣는 두 단계로 나눈다. 이 방식이 언제나 안전하다.
CREATE TABLE tblB (
col2 STRING,
colA STRING,
col3 STRING,
col4 STRING,
PRIMARY KEY (col2, colA)
)
PARTITION BY HASH (col2, colA) PARTITIONS 6
STORED AS KUDU;
INSERT INTO tblB (col2, colA, col3, col4)
SELECT col2, col1, col3, col4 FROM tblA;
INSERT INTO target_kudu SELECT * FROM source_kudu;
UPSERT INTO target_kudu SELECT * FROM source_kudu;
INSERT 는 같은 기본키가 이미 있으면 오류나 무시로 처리된다. UPSERT 는 있으면 갱신하고 없으면 삽입한다. 재실행 가능한 배치를 만들려면 UPSERT 를 쓴다.
컬럼 목록을 생략하면 위치 기준으로 매핑된다. 이름이 같아도 순서가 다르면 엉뚱한 컬럼에 들어가므로, 스키마가 조금이라도 다르면 컬럼 목록을 명시한다.
SET MEM_LIMIT=8g;
SET NUM_NODES=0;
INSERT INTO target_kudu /* +NOCLUSTERED */
SELECT * FROM source_kudu;
COMPUTE STATS target_kudu;
Kudu 쓰기는 기본키 순서에 민감하다. 대량 적재 중 기본키가 무작위로 흩어지면 tablet server 의 메모리 사용과 compaction 부담이 커진다. 적재가 느려지거나 Timed out 이 나면 한 번에 넣는 양을 줄여 구간별로 나눠 넣는다.
INSERT INTO target_kudu
SELECT * FROM source_kudu WHERE event_date BETWEEN '2026-01-01' AND '2026-01-31';
분석용 사본이나 아카이브를 만들 때는 Parquet 으로 떨어뜨린다.
CREATE TABLE archive_2025 STORED AS PARQUET AS
SELECT * FROM kudu_events
WHERE event_time < NOW() - INTERVAL 1 YEAR;
LOCATION 을 지정하면 HDFS 나 S3 경로에 바로 쓸 수 있다.
CTAS 는 원본의 컬럼 속성(인코딩, 압축, 기본값)까지 가져오지 않는다. 운영 테이블을 그대로 재현해야 한다면 SHOW CREATE TABLE 로 원본 DDL 을 받아 수정해 쓰는 편이 정확하다.
SHOW CREATE TABLE existing_kudu_table;