Hacer consultas de viaje en el tiempo y de viaje de versión - Amazon Athena

Hacer consultas de viaje en el tiempo y de viaje de versión

Cada tabla de Apache Iceberg mantiene un manifiesto con versiones de los objetos de Amazon S3 que contiene. Las versiones anteriores del manifiesto se pueden usar para las consultas de viaje en el tiempo y de viaje de versión.

Las consultas de viaje en el tiempo de Athena consultan en Amazon S3 para obtener los datos históricos de una instantánea coherente a partir de una fecha y hora especificas. Las consultas de viaje de versión en Athena consultan Amazon S3 para obtener datos históricos a partir de un ID de instantánea especificado.

Consultas de viaje en el tiempo

Para ejecutar una consulta de viaje en el tiempo, use FOR TIMESTAMP AS OF timestamp después del nombre de la tabla en la instrucción SELECT, como en el siguiente ejemplo.

SELECT * FROM iceberg_table FOR TIMESTAMP AS OF timestamp

La hora del sistema que se especificará para viajar puede ser una marca temporal o una marca temporal con una zona horaria. Si no se especifica, Athena considera que el valor es una marca de tiempo en el huso horario UTC.

En el siguiente ejemplo de consultas de viaje en el tiempo, se seleccionan los datos de CloudTrail para la fecha y hora especificadas.

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)

Consultas de viaje de versión

Para ejecutar una consulta de viaje de versiones (es decir, ver una instantánea coherente a partir de una versión especificada), utilice FOR VERSION AS OF version después del nombre de la tabla en la instrucción SELECT, como en el siguiente ejemplo.

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

El parámetro de la versión es el ID de instantánea bigint asociado a una versión de la tabla de Iceberg.

En el siguiente ejemplo de consulta de viaje de versiones, se seleccionan los datos de la versión especificada.

SELECT * FROM iceberg_table FOR VERSION AS OF 949530903748831860
nota

Las cláusulas FOR SYSTEM_TIME AS OF y FOR SYSTEM_VERSION AS OF de la versión 2 del motor de Athena se han sustituido por las cláusulas FOR TIMESTAMP AS OF y FOR VERSION AS OF de la versión 3 del motor de Athena.

Recuperación del id. de la instantánea

Puede utilizar la clase SnapshotUtil de Java proporcionada por Iceberg para recuperar el ID de una instantánea de Iceberg, como se muestra en el siguiente ejemplo.

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

Combinación de viajes en el tiempo y de versión

Se puede usar la sintaxis de viaje en el tiempo y de versión en la misma consulta para especificar diferentes condiciones de tiempo y de control de versiones, como en el siguiente ejemplo.

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)