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
dopo il nome della tabella nell'istruzione timestampSELECT, come nel seguente esempio:
SELECT * FROM iceberg_table FOR TIMESTAMP AS OFtimestamp
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
dopo il nome della tabella nell'istruzione versionSELECT, come nell'esempio seguente.
SELECT * FROM [db_name.]table_nameFOR VERSION AS OFversion
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
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_nameFOR TIMESTAMP AS OF (current_timestamp - interval '1' day) AS table1 FULL JOIN [db_name.]table_nameFOR VERSION AS OF 5487432386996890161 AS table2 ON table1.ts = table2.ts WHERE (table1.id IS NULL OR table2.id IS NULL)