Data Engineering

Spark + Iceberg - 4(Time Travel)

HOONY_612 2024. 1. 18. 21:20
반응형

 

소개

 

아이스버그 기능인 Time Travel기능에 대해서 살펴보자.

데이터를 Create or Delete 시 Snapshot이 만들어지는데 이것을 이용해 과거 데이터로 롤백할 수 있다.

Partition이 변경되는 부분은 기록이 안되는 것 같다.

간단한 기능 실습을 해보자.

 

실습

 

1. CREAT TABLE

create table time_travel (
    ID BIGINT,
    NAME STRING
) USING ICEBERG
    LOCATION 's3a://martinispark/timetravel'

 

 

2. INSERT INTO Data

INSERT INTO time_travel VALUES
(1,'martini'),
(2,'kebin'),
(3,'jack')

 

 

3. INSERT INTO Data

INSERT INTO time_travel VALUES
(4,'dayoung'),
(5,'elly')

 

4. Data 조회

 

5. DELETE Data

DELETE FROM time_travel WHERE id=3

 

6. Data 조회

 

7. SNAPSHOT 조회

 

SNAPSHOT 조회 시 Catalog 이름을 붙여줘야 에러가 발생하지 않는다.

SELECT * FROM default.time_travel.snapshots;

 

Table Column 정보는 아래와 같다.

* 언제 커밋했는지

* snapshot 및 부모 snapshot이 누군지

* 어떤 Operation을 했는지

* Data 파일이 뭔지

commited_at snapshot_id parent_id operation manifest_list summary
2024-01-18 20:58:10.210000000 8940556835085920119 null append s3a://martinispark/timetravel/metadata/snap-8940556835085920119-1-20c3d100-78c0-4666-8344-d28059829f2c.avro {"added-data-files":"3","added-files-size":"1970","added-records":"3","changed-partition-count":"1","spark.app.id":"local-1705578282576","total-data-files":"3","total-delete-files":"0","total-equality-deletes":"0","total-files-size":"1970","total-position-deletes":"0","total-records":"3"}
2024-01-18 20:59:44.562000000 1996225637494114706 8940556835085920119 append s3a://martinispark/timetravel/metadata/snap-1996225637494114706-1-8aef7b55-a7ff-4cb2-a918-c5f6e2498cd0.avro {"added-data-files":"2","added-files-size":"1316","added-records":"2","changed-partition-count":"1","spark.app.id":"local-1705578282576","total-data-files":"5","total-delete-files":"0","total-equality-deletes":"0","total-files-size":"3286","total-position-deletes":"0","total-records":"5"}
2024-01-18 21:06:26.198000000 5598258952097923005 1996225637494114706 delete s3a://martinispark/timetravel/metadata/snap-5598258952097923005-1-4f188e74-30c7-46ec-80d2-a641be6421e7.avro {"changed-partition-count":"1","deleted-data-files":"1","deleted-records":"1","removed-files-size":"647","spark.app.id":"local-1705578282576","total-data-files":"4","total-delete-files":"0","total-equality-deletes":"0","total-files-size":"2639","total-position-deletes":"0","total-records":"4"}

 

8. Time Travel 기능 이용

 

Spark3.3.0 이상부터 지원한다. 2가지 SQL로 이용할 수 있다.

SELECT * FROM T 
FOR SYSTEM_TIME AS OF <TIMESTAMP>;

SELECT * FROM t 
FOR SYSTEM_VERSION AS OF <SNAPSHOT_ID>;

 

첫 번째 Snapshot을 보자

SELECT * FROM time_travel FOR SYSTEM_VERSION AS OF 8940556835085920119;

 

두 번째는 TIMESTAMP를 이용해보자.

SELECT * FROM time_travel FOR SYSTEM_TIME AS OF '2024-01-18 20:59:44.562000000';

 

 

이렇게 Iceberg Table의 Time Travel 기능을 이용해봤다.

반응형