Iceberg delete mode

Q·2025년 9월 22일

Iceberg

목록 보기
12/14

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_pathpos 순으로 정렬하여, 쿼리 시 효율적으로 적용할 수 있다.

단점

  • 삭제 정보가 많아지면 파일 크기가 커지고, 관리가 복잡해진다.
  • 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: 단일 컬럼 삭제

  • 테이블에 아래 데이터가 있다고 가정
idcategoryname
1marsupialKoala
2toyTeddy
3NULLGrizzly
4NULLPolar
  • 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 파일 경로와 메트릭스 기록.

쿼리 시 흐름

  1. Iceberg는 스냅샷을 로딩manifest list 확인.
  2. manifest list 안에 있는 데이터 manifest + delete manifest를 읽음.
  3. delete manifest 내의 DV / Position Delete / Equality Delete 정보를 조합해서 해당 데이터 파일을 필터링.
    • DV → 특정 pos 제외
    • Position Delete → 특정 파일+pos 제외
    • Equality Delete → 조건식 일치하는 행 제외
profile
Data Engineer

1개의 댓글

comment-user-thumbnail
2025년 12월 8일

깔끔한 정리 감사합니다. 글로만 봐도 이해가 잘 되네요 ㅎㅎ

답글 달기