시간 이동 및 버전 이동 쿼리 수행 - Amazon Athena

시간 이동 및 버전 이동 쿼리 수행

각 Apache Iceberg 테이블은 포함하는 Amazon S3 객체의 버전이 지정된 매니페스트를 유지 관리합니다. 이전 버전의 매니페스트는 시간 이동 및 버전 이동 쿼리에 사용할 수 있습니다.

Athena 시간 이동 쿼리는 지정된 날짜 및 시간을 기준으로 일관된 스냅샷의 기록 데이터에 대해 Amazon S3를 쿼리합니다. Athena의 버전 이동 쿼리는 지정된 스냅샷 ID를 기준으로 기록 데이터에 대해 Amazon S3를 쿼리합니다.

시간 이동 쿼리

시간 이동 쿼리를 실행하려면 다음 예와 같이 SELECT 문의 테이블 이름 다음에 FOR TIMESTAMP AS OF timestamp를 사용합니다.

SELECT * FROM iceberg_table FOR TIMESTAMP AS OF timestamp

이동을 위해 지정할 시스템 시간은 타임스탬프 또는 시간대가 있는 타임스탬프입니다. 지정하지 않으면 Athena는 이 값을 UTC 시간의 타임스탬프로 간주합니다.

다음 예제 시간 이동 쿼리는 지정된 날짜 및 시간에 대한 CloudTrail 데이터를 선택합니다.

SELECT * FROM iceberg_table FOR TIMESTAMP AS OF TIMESTAMP '2020-01-01 10:00:00 UTC'
SELECT * FROM iceberg_table FOR TIMESTAMP AS OF (current_timestamp - interval '1' day)

버전 이동 쿼리

버전 이동 쿼리를 실행하려면(즉, 지정된 버전을 기준으로 일관된 스냅샷 뷰) 다음 예와 같이 SELECT 문의 테이블 이름 다음에 FOR VERSION AS OF version을 사용합니다.

SELECT * FROM [db_name.]table_name FOR VERSION AS OF version

버전 파라미터는 Iceberg 테이블 버전과 연결된 bigint 스냅샷 ID입니다.

다음 예제 버전 이동 쿼리는 지정된 버전에 대한 데이터를 선택합니다.

SELECT * FROM iceberg_table FOR VERSION AS OF 949530903748831860
참고

Athena 엔진 버전 2의 FOR SYSTEM_TIME AS OFFOR SYSTEM_VERSION AS OF 절은 Athena 엔진 버전 3에서 FOR TIMESTAMP AS OFFOR VERSION AS OF 절로 대체되었습니다.

스냅샷 ID 검색

Iceberg에서 Java SnapshotUtil 클래스를 사용하여 다음 예제와 같이 Iceberg 스냅샷 ID를 검색할 수 있습니다.

import org.apache.iceberg.Table; import org.apache.iceberg.aws.glue.GlueCatalog; import org.apache.iceberg.catalog.TableIdentifier; import org.apache.iceberg.util.SnapshotUtil; import java.text.SimpleDateFormat; import java.util.Date; Catalog catalog = new GlueCatalog(); Map<String, String> properties = new HashMap<String, String>(); properties.put("warehouse", "s3://amzn-s3-demo-bucket/my-folder"); catalog.initialize("my_catalog", properties); Date date = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss").parse("2022/01/01 00:00:00"); long millis = date.getTime(); TableIdentifier name = TableIdentifier.of("db", "table"); Table table = catalog.loadTable(name); long oldestSnapshotIdAfter2022 = SnapshotUtil.oldestAncestorAfter(table, millis);

시간 이동과 버전 이동 결합

다음 예와 같이 동일한 쿼리에서 시간 이동 및 버전 이동 구문을 사용하여 서로 다른 타이밍 및 버전 관리 조건을 지정할 수 있습니다.

SELECT table1.*, table2.* FROM [db_name.]table_name FOR TIMESTAMP AS OF (current_timestamp - interval '1' day) AS table1 FULL JOIN [db_name.]table_name FOR VERSION AS OF 5487432386996890161 AS table2 ON table1.ts = table2.ts WHERE (table1.id IS NULL OR table2.id IS NULL)