Impala 4 이상에서 Iceberg 테이블을 직접 만들 수 있다. 갱신·삭제가 필요하면 반드시 format-version 2 로 만든다.
CREATE TABLE db.tbl (
id BIGINT,
name STRING,
amt DECIMAL(18,2)
)
PARTITIONED BY SPEC (bucket(16, id))
STORED AS ICEBERG
TBLPROPERTIES ('format-version'='2');
버전 1 은 append 전용이다. 버전 1 로 만든 뒤 UPDATE 를 시도하면 지원하지 않는다는 오류가 나며, 이때는 테이블 프로퍼티로 올릴 수 있다.
ALTER TABLE db.tbl SET TBLPROPERTIES ('format-version'='2');
DESCRIBE FORMATTED db.tbl;
경로를 지정하려면 LOCATION 을 준다. S3 호환 스토리지도 같은 방식이다.
CREATE TABLE db.tbl (id BIGINT, name STRING)
STORED AS ICEBERG
LOCATION 's3a://bucket/warehouse/db/tbl'
TBLPROPERTIES ('format-version'='2');
format-version 2 는 행 단위 삭제를 delete 파일로 기록한다. 기록 방식은 두 가지다.
| 방식 | 프로퍼티 | 특징 |
|---|---|---|
| copy-on-write | write.delete.mode=copy-on-write |
삭제 시 데이터 파일을 다시 씀. 쓰기 느림, 읽기 빠름 |
| merge-on-read | write.delete.mode=merge-on-read |
delete 파일만 남김. 쓰기 빠름, 읽기 시 병합 비용 |
write.update.mode · write.merge.mode 도 같은 값을 받는다. 갱신이 잦고 조회가 뜸하면 merge-on-read, 반대면 copy-on-write 가 유리하다. merge-on-read 를 쓰면 delete 파일이 쌓이므로 주기적인 compaction 이 전제다.
UPDATE db.tbl SET amt = 0 WHERE bse_dt = '20250328';
DELETE FROM db.tbl WHERE id = 100;
스냅샷 이력과 파일 목록은 메타데이터로 조회한다. 사용하는 버전에서 어떤 메타데이터 테이블이 열리는지는 다르므로 먼저 확인한다.
SELECT * FROM db.tbl.snapshots;
SELECT * FROM db.tbl.history;
특정 시점 조회(time travel)를 지원하는 버전이라면 FOR SYSTEM_TIME AS OF · FOR SYSTEM_VERSION AS OF 를 쓴다.
Hive 나 Spark 로 만든 Iceberg 테이블을 Impala 가 읽는 구성은 흔하지만, 기능 지원 범위는 엔진과 버전마다 다르다. 특히 오래된 Impala 는 Iceberg v2 의 쓰기를 지원하지 않고 읽기만 된다. 새 기능을 쓰기 전에 다음 셋을 함께 확인한다.
Impala 버전, Iceberg 라이브러리 버전, 그리고 카탈로그 종류(HiveCatalog 인지 HadoopCatalog 인지)다. 카탈로그가 다르면 같은 테이블을 다른 엔진에서 못 볼 수 있다.