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 기능을 이용해봤다.
반응형