Iceberg 테이블 데이터 쿼리 및 시간 이동 수행 - Amazon Athena

Iceberg 테이블 데이터 쿼리 및 시간 이동 수행

Iceberg 데이터 세트를 쿼리하려면 다음과 같이 표준 SELECT 문을 사용합니다. 쿼리는 Apache Iceberg 포맷 v2 사양을 따르며 위치 및 동일 삭제 모두에 대해 병합 시 읽기 작업을 수행합니다.

SELECT * FROM [db_name.]table_name [WHERE predicate]

쿼리 시간을 최적화하기 위해 일부 술어는 데이터가 존재하는 곳으로 푸시다운됩니다.

시간 이동 및 버전 이동 쿼리

각 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://DOC-EXAMPLE-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)

Iceberg 테이블에서 보기 생성 및 쿼리하기

Iceberg 테이블에서 Athena 보기를 생성하고 쿼리하려면 뷰 작업에 설명된 대로 CREATE VIEW 보기를 사용합니다.

예제

CREATE VIEW view1 AS SELECT * FROM iceberg_table
SELECT * FROM view1

Iceberg 보기 사양을 사용하여 보기를 생성하려면 athena-feedback@amazon.com에 문의하세요.

Lake Formation 세분화된 액세스 제어 작업

Athena 엔진 버전 3에서는 열 수준 및 행 수준 보안 액세스 제어를 포함하여 Iceberg 테이블을 통한 Lake Formation 세분화된 액세스 제어를 지원합니다. 이 액세스 제어는 시간 이동 쿼리 및 스키마 진화를 수행한 테이블과 함께 작동합니다. 자세한 내용은 Lake Formation 세분화된 액세스 제어 및 Athena 작업 그룹 섹션을 참조하세요.

Athena 외부에서 Iceberg 테이블을 생성한 경우 Iceberg 테이블 열 정보가 AWS Glue Data Catalog에 채워지도록 Apache Iceberg SDK 버전 0.13.0 이상을 사용하세요. Iceberg 테이블에 AWS Glue의 열 정보가 포함되어 있지 않은 경우 Athena ALTER TABLE SET PROPERTIES 문 또는 최신 Iceberg SDK를 사용하여 AWS Glue에서 테이블을 수정하고 열 정보를 업데이트할 수 있습니다.