📊 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 이전 상태)
반응형
'Tools > Iceberg' 카테고리의 다른 글
Trino 쿼리를 통한 Iceberg 내부 살펴보기 (2) | 2025.07.31 |
---|---|
Iceberg에서 Tagging을 활용한 데이터 Snapshot 관리 (0) | 2025.07.31 |
Apache Iceberg 기본 구조 (0) | 2025.01.16 |