查詢 Iceberg 資料表資料並執行時間歷程 - Amazon Athena

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

查詢 Iceberg 資料表資料並執行時間歷程

若要查詢 Iceberg 資料集,請使用標準 SELECT 陳述式,如下所示。查詢遵循 Apache 冰山格式 v2 規範,並執 merge-on-read 行位置和相等刪除。

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

為了盡量縮短查詢時間,所有述詞都會被推送到資料所在的位置。

時間歷程和版本歷程查詢

每個 Apache Iceberg 資料表都會有一份其所含 Amazon S3 物件的版本資訊清單。使用過往的版本資訊清單可查詢時間歷程和版本歷程。

Athena 中的時間歷程查詢可在 Simple Storage Service (Amazon S3) 中查詢截至某個指定日期和時間的資料,歷程資料會統一顯示成一個快照。Athena 中的版本歷程查詢可在 Simple Storage Service (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

版本參數是與 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 OF and FOR VERSION AS OF 子句取代。

擷取快照 ID

您可以使用冰山提供的 Java SnapshotUtil類來檢索冰山快照 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 支援 Lake Formation 與 Iceberg 資料表的精細存取控制,包括資料欄層級和資料列層級的安全存取控制。此存取控制適用於時間歷程查詢及已執行結構描述演變的資料表。如需詳細資訊,請參閱 Lake Formation 精細存取控制和 Athena 工作群組

如果您在 Athena 外部建立了 Iceberg 資料表,則請使用 Apache Iceberg SDK 版本 0.13.0 或更高版本,以便將您的 Iceberg 資料表資料欄資訊填入 AWS Glue Data Catalog。如果您的 Iceberg 資料表不包含中的欄資訊 AWS Glue,您可以使用 Athena ALTER TABLE SET PROPERTIES 陳述式或最新的 Iceberg SDK 來修正資料表並更新中的欄資訊。 AWS Glue