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
después del nombre de la tabla en la instrucción timestamp
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
después del nombre de la tabla en la instrucción version
SELECT
, como en el siguiente ejemplo.
SELECT * FROM [
db_name
.]table_name
FOR VERSION AS OFversion
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
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)