Delete Mode
1. Deletion Vector (DV)
- Iceberg v3에서 새로 추가된 방식으로, 특정 데이터 파일의 삭제된 행을 비트맵(bitmap)으로 표현
- 데이터 파일 내부에서 어떤 행이 삭제되었는지
0/1 형태로 표시하므로, 쿼리 시 해당 비트맵만 확인하면 삭제 여부를 빠르게 판별할 수 있다.
- Puffin 파일 포맷의 blob으로 저장되며, 메타데이터에는
file_path, content_offset, content_size_in_bytes 등이 기록된다.
특징
- 스냅샷마다 데이터 파일당 최대 하나의 DV만 허용된다.
- DV가 존재하면 해당 데이터 파일에 대한 기존 position delete file은 무시된다.
- 64비트 행 포지션을 지원하되, 대부분 32비트에서 표현 가능하도록 Roaring Bitmap 최적화를 사용
장점
- 관리가 간단(파일당 1개).
- 압축률이 높고 I/O 효율적
- 쿼리 시 빠른 적용이 가능하다.
예시
- 데이터 쓰기 (Write)
- 새로운 데이터 파일
data1.parquet 생성.
- 이 파일에서 특정 행(예: 100번, 150번, 200번 행)을 삭제해야 할 때, DV(비트맵
[100, 150, 200] 위치에 1이 찍힌 상태로 저장) 생성.
- DV는 Puffin blob으로 저장되고, delete manifest에 추가됨.
- 커밋 (Commit)
- 새로운 스냅샷이 만들어짐.
- 이 스냅샷의 manifest list에 DV가 포함된 delete manifest가 등록됨.
- 쿼리/스캔 (Read/Scan)
- Iceberg는 스냅샷의 manifest list → delete manifest → DV 참조.
- 데이터 파일 data1.parquet 읽기 전, DV 확인.
- DV 비트맵을 메모리에 로드 후, 읽은 레코드에서 해당 pos 제외.
- 즉, 스캔 시 자동으로 삭제된 행이 제거된 결과가 반환됨.
2. Position Delete
- Iceberg v2에서 사용된 방식으로, 데이터 파일의 경로(file_path)와 행의 위치(pos)를 직접 기록해 삭제를 표현
- 파일 내부의 특정 위치의 행을 삭제하는 것이므로, 행 번호(0부터 시작) 기반으로 관리
- 삭제된 행의 값(row value)을 함께 저장할 수도 있는데, 이는 변경 이력(reconstruct stream of changes) 재생 시 유용합니다.
특징
file_path + pos를 기준으로 삭제 대상을 찾는다.
- 행 데이터(row)를 추가로 저장하면 정확한 삭제 검증 가능.
- delete 파일 내부는
file_path → pos 순으로 정렬하여, 쿼리 시 효율적으로 적용할 수 있다.
단점
- 삭제 정보가 많아지면 파일 크기가 커지고, 관리가 복잡해진다.
- Iceberg v3에서는 deprecated 되었고, DV로 대체된다.
예시
data1.parquet에서 150번 행이 삭제되었다면, position delete 파일에 아래와 같이 기록된다.
file_path = data1.parquet
pos = 150
row = {id: 123, name: "Alice", ...}
3. Equality Delete
- 값 기반(row value based) 삭제 방식
- 특정 컬럼 값이 일치하는 행을 삭제 대상으로 간주
- delete 파일에는 삭제를 적용할 컬럼의 값들이 저장된다. 즉, 이 값과 동일한 데이터를 가진 모든 행이 삭제된다.
- delete 파일의
equality_ids 메타데이터에 어떤 컬럼이 비교 기준인지(field id)가 기록된다.
특징
- 한 번에 여러 데이터 파일에 적용할 수 있다(특정 파티션뿐만 아니라 전역 적용도 가능).
- null 값도 허용(예: category IS NULL).
- 삭제 대상 컬럼은 테이블의 identifier field 규칙을 따른다. 단, equality delete는 optional column도 허용된다.
예시 1: 단일 컬럼 삭제
| id | category | name |
|---|
| 1 | marsupial | Koala |
| 2 | toy | Teddy |
| 3 | NULL | Grizzly |
| 4 | NULL | Polar |
- id = 3을 삭제하려면 equality delete 파일에 아래처럼 기록된다.
equality_ids = [id]
values = {3}
예시 2: 다중 컬럼 삭제
id = 4 AND category IS NULL 조건으로 삭제하려면
equality_ids = [id, category]
values = {4, NULL}
Delete Modes와 Delete Manifest 관계
- Iceberg에서 지원하는 모든 delete 모드(DV, Position Delete, Equality Delete) 는 결국 delete manifest에 기록되어야 테이블 메타데이터에 반영되고, 이후 쿼리 시 반영
공통 동작
- Delete 모드로 어떤 행(row)이나 조건(condition)이 삭제되면 → 해당 삭제 정보가 delete manifest에 저장됨.
- 이 delete manifest는 스냅샷의 manifest list에 포함되고, 이후 스냅샷 기반 쿼리에서 참조됨.
- 따라서 Iceberg는 항상 데이터 파일 + delete manifest 조합을 읽고 최종 결과를 반환한다.
Delete 모드별 delete manifest 기록
-
Deletion Vector (DV)
- 데이터 파일 단위 비트맵.
- delete manifest에 DV blob의 위치(
file_path, content_offset, content_size_in_bytes)와 참조 데이터 파일(referenced_data_file)이 기록됨.
-
Position Delete
- 파일 경로(
file_path) + 삭제된 행 위치(pos) + (선택적으로) 삭제된 row 값 기록.
- delete manifest는 이 delete 파일의 경로와 메트릭스를 관리.
-
Equality Delete
- 특정 컬럼 값이 같은 행 전체를 삭제하는 조건식 기반.
- delete manifest는 equality delete 파일 경로와 메트릭스 기록.
쿼리 시 흐름
- Iceberg는 스냅샷을 로딩 → manifest list 확인.
- manifest list 안에 있는 데이터 manifest + delete manifest를 읽음.
- delete manifest 내의 DV / Position Delete / Equality Delete 정보를 조합해서 해당 데이터 파일을 필터링.
- DV → 특정 pos 제외
- Position Delete → 특정 파일+pos 제외
- Equality Delete → 조건식 일치하는 행 제외
깔끔한 정리 감사합니다. 글로만 봐도 이해가 잘 되네요 ㅎㅎ