Eseguire query temporali e di versione - Amazon Athena

Eseguire query temporali e di versione

Ogni tabella Apache Iceberg conserva un manifesto con versioni degli oggetti Amazon S3 che comprende. Le versioni precedenti del manifesto possono essere utilizzate per le query temporali e di versione.

Le query temporali in Athena interrogano Amazon S3 relativamente a dati storici da uno snapshot coerente con una data e un'ora specificate. Le query di versione in Athena interrogano Amazon S3 relativamente a dati storici a partire da un ID snapshot specificato.

Query temporali

Per eseguire una query temporale, utilizza FOR TIMESTAMP AS OF timestamp dopo il nome della tabella nell'istruzione SELECT, come nel seguente esempio:

SELECT * FROM iceberg_table FOR TIMESTAMP AS OF timestamp

L'ora del sistema da specificare per il viaggio è un timestamp o un timestamp con un fuso orario. Se non specificato, Athena considera il valore come un timestamp nell'ora UTC.

Nell'esempio seguente le query temporali selezionano i dati CloudTrail per la data e l'ora specificate.

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)

Query di versione

Per eseguire una query di versione (ovvero visualizzare uno snapshot coerente a partire da una versione specificata), utilizza FOR VERSION AS OF version dopo il nome della tabella nell'istruzione SELECT, come nell'esempio seguente.

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

Il parametro version è l'ID snapshot bigint associato a una versione della tabella Iceberg.

La seguente query di versione di esempio seleziona i dati per la versione specificata.

SELECT * FROM iceberg_table FOR VERSION AS OF 949530903748831860
Nota

Le clausole FOR SYSTEM_TIME AS OF e FOR SYSTEM_VERSION AS OF nella versione 2 del motore Athena sono state sostituite dalle clausole FOR TIMESTAMP AS OF e FOR VERSION AS OF nella versione 3 del motore Athena.

Recuperare l'ID snapshot

È possibile utilizzare la classe SnapshotUtil di Java fornita da Iceberg per recuperare l'ID snapshot di Iceberg, come nel seguente esempio.

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

Combinare query temporali e di versione

È possibile utilizzare la sintassi delle query temporali e di versione nella stessa query per specificare condizioni di temporizzazione e controllo delle versioni diverse, come nell'esempio seguente.

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)