Tools/Iceberg

Apache Iceberg 기본 동작 확인 및 실습 정리

칼쵸쵸 2025. 7. 6. 21:18

📊 demo.analytics_users 테이블 상태 변화 요약

Snapshot 단계 작업 내용 테이블 상태 (id, name)

초기 생성 INSERT (Alice, Bob) (1, 'Alice'), (2, 'Bob')
Snapshot 2 DELETE id = 2 (1, 'Alice')
Snapshot 3 UPDATE id = 1 (1, 'Charlie')
Snapshot 4 MERGE INTO (id = 3) (1, 'Charlie'), (3, 'David')
Snapshot 5 ROLLBACK to Snap 1 (1, 'Alice'), (2, 'Bob')
Snapshot 6 INSERT (Eve) (1, 'Alice'), (2, 'Bob'), (4, 'Eve')

✅ 1. Iceberg 테이블 생성 및 데이터 삽입

📌 Spark SQL

CREATE TABLE demo.analytics_users (
  id INT,
  name STRING
)
USING ICEBERG
TBLPROPERTIES ('format-version' = '2');

INSERT INTO demo.analytics_users VALUES
  (1, 'Alice'),
  (2, 'Bob');

📌 Trino

CREATE TABLE iceberg.demo.analytics_users (
  id INT,
  name VARCHAR
)
WITH (
  format_version = 2
);

INSERT INTO iceberg.demo.analytics_users VALUES
  (1, 'Alice'),
  (2, 'Bob');

🔍 예상 결과: 테이블이 정상 생성되고, snapshot 1개가 생성됨 (예: [(1, 'Alice'), (2, 'Bob')])


✅ 2. 스냅샷 존재 확인 및 목록 조회

📌 Spark SQL

SELECT * FROM growth.demo.analytics_users.snapshots;

📌 Trino

SELECT * FROM iceberg.demo."analytics_users$snapshots";

🔍 예상 결과: 최소 1개 이상의 snapshot ID, timestamp, operation(insert 등)이 조회됨


✅ 3. 타임트래블 (Time Travel)

📌 Spark (PySpark)

spark.read \
  .format("iceberg") \
  .option("snapshot-id", "1234567890123") \
  .load("demo.analytics_users")

📌 Trino

SELECT * FROM iceberg.demo.analytics_users
FOR VERSION AS OF 1234567890123;

🔍 예상 결과: 해당 snapshot 시점의 데이터만 조회됨 (예: [(1, 'Alice'), (2, 'Bob')])


✅ 4. Snapshot 간 데이터 차이 확인

📌 Spark (PySpark)

old_df = spark.read.option("snapshot-id", "old_id").format("iceberg").load("demo.analytics_users")
new_df = spark.read.format("iceberg").load("demo.analytics_users")

added = new_df.subtract(old_df)
removed = old_df.subtract(new_df)

🔍 예상 결과:

  • added: 새로 추가된 행만 출력됨 (예: [(3, 'Charlie')])
  • removed: 삭제된 행만 출력됨 (예: [(2, 'Bob')])

✅ 5. 시스템 테이블 $changes 조회 (Trino 전용)

SELECT * FROM iceberg.demo."analytics_users$changes";

❗ DELETE, MERGE, UPDATE 등의 작업이 수행되지 않으면 $changes 테이블은 존재하지 않습니다.

🔍 예상 결과: 변경 기록(snapshot_id, change_type 등)이 담긴 row가 조회됨 (예: INSERT → id=3, name='Charlie')


✅ 6. Row-level 작업 (UPDATE / DELETE / MERGE)

📌 Trino

-- DELETE
DELETE FROM iceberg.demo.analytics_users WHERE id = 2;

-- UPDATE
UPDATE iceberg.demo.analytics_users
SET name = 'Charlie' WHERE id = 1;

-- MERGE
MERGE INTO iceberg.demo.analytics_users t
USING (SELECT 3 AS id, 'David' AS name) s
ON t.id = s.id
WHEN MATCHED THEN UPDATE SET name = s.name
WHEN NOT MATCHED THEN INSERT (id, name);

🔍 예상 결과:

  • DELETE: (2, 'Bob') 제거됨
  • UPDATE: (1, 'Alice') → (1, 'Charlie')로 변경
  • MERGE: 새로운 행 (3, 'David') 추가됨

 


✅ 7. 롤백 (Rollback)

📌 Spark SQL

CALL growth.system.rollback_to_snapshot(
  'demo.analytics_users',
  1234567890123
);

🔍 예상 결과: 테이블의 현재 상태가 지정한 snapshot 시점으로 되돌아감 (예: UPDATE 및 DELETE 이전 상태)


반응형