Exécution de requêtes Time Travel et Version Travel - Amazon Athena

Exécution de requêtes Time Travel et Version Travel

Chaque table Apache Iceberg conserve un manifeste versionné des objets Simple Storage Service (Amazon S3) qu'elle contient. Les versions précédentes du manifeste peuvent être utilisées pour les requêtes Time Travel et Version Travel.

Les requêtes Time Travel dans Athena interrogent Simple Storage Service (Amazon S3) des données historiques à partir d'un instantané cohérent à partir d'une date et d'une heure spécifiées. Les requêtes Version Travel dans Athena interrogent Simple Storage Service (Amazon S3) pour des données historiques à partir d'un ID d'instantané spécifié.

Requêtes Time Travel

Pour exécuter une requête Time Travel, utilisez FOR TIMESTAMP AS OF timestamp après le nom de la table dans l'instruction SELECT, comme dans l'exemple suivant.

SELECT * FROM iceberg_table FOR TIMESTAMP AS OF timestamp

L'heure système à spécifier pour les déplacements est soit un horodatage, soit un horodatage avec un fuseau horaire. Si elle n'est pas spécifiée, Athena considère que la valeur est un horodatage en heure UTC.

Les exemples suivants de requêtes Time Travel sélectionnent les données CloudTrail pour la date et l'heure spécifiées.

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)

Requêtes Version Travel

Pour exécuter une requête Version Travel (c'est-à-dire afficher un instantané cohérent à partir d'une version spécifiée), utilisez FOR VERSION AS OF version après le nom de la table dans l'instruction SELECT, comme dans l'exemple suivant.

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

Le paramètre version est l'ID de l'instantané bigint associé à une version de table Iceberg.

L'exemple de requête Version Travel suivant sélectionne les données pour la version spécifiée.

SELECT * FROM iceberg_table FOR VERSION AS OF 949530903748831860
Note

Les clauses FOR SYSTEM_TIME AS OF et FOR SYSTEM_VERSION AS OF de la version 2 du moteur Athena ont été remplacées par les clauses FOR TIMESTAMP AS OF et FOR VERSION AS OF de la version 3 du moteur Athena.

Récupération de l’ID d’instantané

Vous pouvez utiliser la classe Java SnapshotUtil fournie par Iceberg pour récupérer l’ID d’instantané Iceberg, comme illustré dans l’exemple suivant.

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

Combinaison de Time Travel et Version Travel

Vous pouvez utiliser la syntaxe Time Travel et Version Travel dans la même requête pour spécifier différentes conditions de synchronisation et de gestion des versions, comme dans l'exemple suivant.

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)