Iceberg テーブルデータのクエリとタイムトラベルの実行 - Amazon Athena

Iceberg テーブルデータのクエリとタイムトラベルの実行

Iceberg データセットをクエリするには、次のような標準の SELECT ステートメントを使用します。クエリは Apache Iceberg format v2 spec に従い、位置と等価削除の両方の merge-on-read を実行します。

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

クエリ時間を最適化するために、すべての述語がデータが存在する場所にプッシュダウンされます。

タイムトラベルとバージョントラベルのクエリ

各 Apache Iceberg テーブルは、それが含まれている Simple Storage Service (Amazon S3) オブジェクトのバージョン管理されたマニフェストを維持します。以前のバージョンのマニフェストを、タイムトラベルおよびバージョントラベルのクエリに使用できます。

Athena でのタイムトラベルクエリは、Amazon S3 での指定された日付と時刻における、一貫したスナップショットからの履歴データをクエリします。Athena でのバージョントラベルクエリは、Amazon S3 において指定されたスナップショット ID に関する履歴データをクエリします。

タイムトラベルクエリ

タイムトラベルクエリを実行するには、次の例のように、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

version パラメータは Iceberg テーブルバージョンに関連付けられている bigint スナップショット ID です。

次の例では、バージョントラベルクエリが、指定したバージョンのデータを選択しています。

SELECT * FROM iceberg_table FOR VERSION AS OF 949530903748831860
注記

Athena エンジンのバージョン 2 で FOR SYSTEM_TIME AS OF および FOR SYSTEM_VERSION AS OF の句は、Athena エンジンバージョン 3 の FOR TIMESTAMP AS OF および FOR 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 テーブルを作成した場合は、Apache Iceberg SDK バージョン 0.13.0 以降を使用して、Iceberg テーブルの列情報が AWS Glue Data Catalog に入力されるようにします。AWS Glue のIceberg テーブルに列情報が含まれていない場合は、Athena ALTER TABLE SET PROPERTIES ステートメントまたは最新の Iceberg SDK を使用してテーブルを修正し、AWS Glue の列情報を更新できます。