Zeitreisen- und Versionsreiseabfragen durchführen - Amazon Athena

Zeitreisen- und Versionsreiseabfragen durchführen

Jede Apache-Iceberg-Tabelle verwaltet ein versioniertes Manifest der darin enthaltenen Amazon-S3-Objekte. Frühere Versionen des Manifests können für Zeitreise- und Versionsreiseabfragen verwendet werden.

Zeitreiseabfragen in Athena fragen Amazon S3 nach historischen Daten aus einem konsistenten Snapshot ab einem bestimmten Datum und einer bestimmten Uhrzeit ab. Versionsreiseabfragen in Athena fragen Amazon S3 nach historischen Daten ab einer angegebenen Snapshot-ID ab.

Zeitreiseabfragen

Um eine Zeitreiseabfrage auszuführen, verwenden Sie FOR TIMESTAMP AS OF timestamp nach dem Tabellennamen in der SELECT-Anweisung, wie im folgenden Beispiel.

SELECT * FROM iceberg_table FOR TIMESTAMP AS OF timestamp

Die für Reisen festzulegende Systemzeit ist entweder ein Zeitstempel oder ein Zeitstempel mit einer Zeitzone. Wenn nicht angegeben, betrachtet Athena den Wert als Zeitstempel in UTC-Zeit.

Im folgenden Beispiel werden Zeitreiseabfragen CloudTrail-Daten für das angegebene Datum und die festgelegte Uhrzeit ausgewählt.

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)

Versionsreiseabfragen

Um eine Versionsreiseabfrage durchzuführen (d. h. einen konsistenten Snapshot ab einer angegebenen Version anzuzeigen), verwenden Sie FOR VERSION AS OF version nach dem Tabellennamen in der SELECT-Anweisung, wie im folgenden Beispiel.

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

Der Versionsparameter ist die bigint-Snapshot-ID, die einer Iceberg-Tabellenversion zugeordnet ist.

Die folgende Beispielversionsreiseabfrage wählt Daten für die angegebene Version aus.

SELECT * FROM iceberg_table FOR VERSION AS OF 949530903748831860
Anmerkung

Die FOR SYSTEM_TIME AS OF- und FOR SYSTEM_VERSION AS OF-Klauseln in Athena-Engine-Version 2 wurden durch die FOR TIMESTAMP AS OF- und FOR VERSION AS OF-Klauseln in Athena-Engine-Version 3 ersetzt.

Abrufen der Snapshot-ID

Sie können die von Iceberg bereitgestellte Java SnapshotUtil Klasse, um die Iceberg-Snapshot-ID abzurufen, wie im folgenden Beispiel.

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);

Zeit- und Versionsreisen kombinieren

Sie können Zeitreisen- und Versionsreisesyntax in derselben Abfrage verwenden, um verschiedene Timing- und Versionsbedingungen anzugeben, wie im folgenden Beispiel.

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)