

# Consulta de tablas de Apache Iceberg
<a name="querying-iceberg"></a>

Puede utilizar Athena para hacer consultas de lectura, viajes en el tiempo, escritura y DDL en tablas de Apache Iceberg.

[Apache Iceberg](https://iceberg.apache.org/) es un formato de tabla abierto para conjuntos de datos analíticos muy grandes. Iceberg administra grandes colecciones de archivos como tablas y admite operaciones modernas de lago de datos analíticos, como las consultas de inserción, actualización y eliminación de registros, y viajes en el tiempo. La especificación de Iceberg permite la evolución de las tablas sin problemas, como la evolución de esquemas y particiones, y se ha diseñado para el uso optimizado en Amazon S3. Iceberg también ayuda a garantizar la corrección de los datos en escenarios de escritura simultanea.

Para más información sobre Apache Iceberg, consulte [https://iceberg.apache.org/](https://iceberg.apache.org/).

## Consideraciones y limitaciones
<a name="querying-iceberg-considerations-and-limitations"></a>

La compatibilidad de Athena con las tablas de Iceberg tiene las siguientes consideraciones y limitaciones:
+ **Compatibilidad con la versión de Iceberg**: Athena es compatible con la versión 1.4.2 de Apache Iceberg. 
+ **Tablas registradas en Lake Formation**: Actualmente, Athena no admite operaciones de DDL en tablas Iceberg que estén registradas en Lake Formation. 
+ **Consultas contra el esquema de información**: al consultar el esquema de información de las tablas Iceberg, Athena utiliza los metadatos de S3 como fuente de verdad para los metadatos de las columnas. Esto significa que la información de las columnas se deriva de los archivos S3 subyacentes en lugar de los metadatos del catálogo. Este comportamiento difiere de otros formatos de tabla donde los metadatos del catálogo pueden ser la fuente principal de la información de las columnas.
+ **Tablas de AWS Glue Catalog únicamente**: solo las tablas de Iceberg creadas con AWS Glue Catalog basado en las especificaciones definidas por la [implementación de Glue Catalog de código abierto](https://iceberg.apache.org/docs/latest/aws/#glue-catalog) son compatibles con Athena.
+ **Soporte de bloqueo de tablas de AWS Glue únicamente**: a diferencia de la implementación del catálogo Glue de código abierto, que admite el bloqueo personalizado de complementos, Athena admite el bloqueo positivo de AWS Glue únicamente. El uso de Athena para modificar una tabla de Iceberg con cualquier otra implementación de bloqueo provocará posibles pérdidas de datos y la interrupción de transacciones.
+ **Formatos de archivo compatibles**: la versión 3 del motor de Athena es compatible con los siguientes formatos de archivos Iceberg.
  + Parquet
  + ORC
  + Avro
+ **Metadatos de Iceberg restringidos**: Lake Formation no evalúa las tablas de metadatos de Iceberg. Por lo tanto, las tablas de metadatos de Iceberg están restringidas si la tabla base tiene filtros de fila o celda de Lake Formation, o si no cuenta con los permisos necesarios para ver todas las columnas de la tabla base. En estos casos, al consultar las tablas de metadatos de Iceberg `$partitions`, `$files`, `$manifests` y `$snapshots`, se produce el error `AccessDeniedException`. Además, la columna de metadatos `$path` está sujeta a las mismas restricciones de Lake Formation y genera un error cuando se selecciona en la consulta. Todas las demás tablas de metadatos se pueden consultar independientemente de los filtros de Lake Formation. Para obtener más información, consulte [Tablas de metadatos](https://trino.io/docs/current/connector/iceberg.html#metadata-tables).
+ **Tablas Iceberg v2**: Athena solo crea y opera con tablas de Iceberg v2. Para ver la diferencia entre las tablas v1 y v2, consulte [Cambios de versión de formato](https://iceberg.apache.org/spec/#appendix-e-format-version-changes) en la documentación de Apache Iceberg.
+ **Visualización de tipos de hora sin zona horaria**: la hora y la marca de tiempo sin tipos de zona horaria se muestran en UTC. Si la zona horaria no se especifica en una expresión de filtro en una columna de hora, se usa UTC.
+ **Precisión de los datos relacionados con la marca de tiempo**: si bien Iceberg admite una precisión de microsegundos para el tipo de datos de marca de tiempo, Athena solo admite una precisión de milisegundos para las marcas de tiempo tanto en las lecturas como en las escrituras. En el caso de los datos en las columnas relacionadas con la hora que se reescriben durante las operaciones de compactación manual, Athena solo retiene la precisión en milisegundos.
+ **Operaciones no admitidas**: las siguientes operaciones de Athena no se admiten para las tablas de Iceberg. 
  + [ALTER TABLE SET LOCATION](alter-table-set-location.md)
+ **Vistas**: se utiliza `CREATE VIEW` para crear vistas de Athena como se describe en [Trabajo con vistas](views.md). Si está interesado en utilizar la [especificación de vistas de Iceberg](https://github.com/apache/iceberg/blob/master/format/view-spec.md) para crear vistas, póngase en contacto con [athena-feedback@amazon.com](mailto:athena-feedback@amazon.com). 
+ **Comandos de administración de TTF no compatibles en AWS Lake Formation**: si bien puede utilizar Lake Formation a fin de administrar los permisos de acceso de lectura para los formatos de tabla de transacciones (TTF) como Apache Iceberg, Apache Hudi y Linux Foundation Delta Lake, no puede utilizar Lake Formation a fin de administrar los permisos de operaciones como `VACUUM`, `MERGE`, `UPDATE` o `OPTIMIZE` con estos formatos de tabla. Para obtener más información sobre la integración de Lake Formation con Athena, consulte [Uso de AWS Lake Formation con Amazon Athena](https://docs.aws.amazon.com/lake-formation/latest/dg/athena-lf.html) en la *Guía para desarrolladores de AWS Lake Formation*.
+ **Partición por campos anidados**: no se admite la partición por campos anidados. Si lo intenta, aparecerá el mensaje NOT\$1SUPPORTED: No se admite la partición por campos anidados: *column\$1name*.*nested\$1field\$1name*.
+ **No se admite la omisión de objetos de Amazon Glacier**: si los objetos de la tabla de Apache Iceberg se encuentran en una clase de almacenamiento de Amazon Glacier, establecer la propiedad de la tabla `read_restored_glacier_objects` en `false` no tendrá ningún efecto.

  Suponga, por ejemplo, que ejecuta el siguiente comando:

  ```
  ALTER TABLE table_name SET TBLPROPERTIES ('read_restored_glacier_objects' = 'false')
  ```

  En el caso de las tablas de Iceberg y Delta Lake, el comando produce el error Clave de propiedad de tabla no compatible: read\$1restored\$1glacier\$1objects. En el caso de las tablas de Hudi, el comando `ALTER TABLE` no produce ningún error, pero los objetos de Amazon Glacier se mantienen sin omitirse. Al ejecutar consultas `SELECT` después del comando `ALTER TABLE`, se siguen devolviendo todos los objetos.

Si desea que Athena admita una característica en particular, envíe sus comentarios a [athena-feedback@amazon.com](mailto:athena-feedback@amazon.com).

**Topics**
+ [Consideraciones y limitaciones](#querying-iceberg-considerations-and-limitations)
+ [Creación de tablas de Iceberg](querying-iceberg-creating-tables.md)
+ [Consulta de los datos de las tablas de Iceberg](querying-iceberg-table-data.md)
+ [Hacer consultas de viaje en el tiempo y de viaje de versión](querying-iceberg-time-travel-and-version-travel-queries.md)
+ [Actualización de los datos de las tablas de Iceberg](querying-iceberg-updating-iceberg-table-data.md)
+ [Administración de tablas de Iceberg](querying-iceberg-managing-tables.md)
+ [Evolución del esquema de tabla de Iceberg](querying-iceberg-evolving-table-schema.md)
+ [Otras operaciones de DDL en tablas de Iceberg](querying-iceberg-additional-operations.md)
+ [Optimización de las tablas de Iceberg](querying-iceberg-data-optimization.md)
+ [Consulta de vistas materializadas de AWS Glue Data Catalog](querying-iceberg-gdc-mv.md)
+ [Tipos de datos compatibles con las tablas de Iceberg en Athena](querying-iceberg-supported-data-types.md)
+ [Recursos adicionales de](querying-iceberg-additional-resources.md)

# Creación de tablas de Iceberg
<a name="querying-iceberg-creating-tables"></a>

Para crear una tabla de Iceberg a fin de utilizarla en Athena, puede utilizar una instrucción `CREATE TABLE` como se documenta en esta página, o puede utilizar un rastreador de AWS Glue.

## Uso de una instrucción CREATE TABLE
<a name="querying-iceberg-creating-tables-query-editor"></a>

Athena crea tablas de Iceberg v2. Para conocer la diferencia entre las tablas v1 y v2, consulta los [cambios de versión de formato](https://iceberg.apache.org/spec/#appendix-e-format-version-changes) en la documentación de Apache Iceberg.

El comando `CREATE TABLE` de Athena crea una tabla de Iceberg sin datos. Puede consultar una tabla desde sistemas externos como Apache Spark directamente si la tabla utiliza el [catálogo de Glue de código abierto de Iceberg](https://iceberg.apache.org/docs/latest/aws/#glue-catalog). No es necesario crear una tabla externa.

**aviso**  
La ejecución del comando `CREATE EXTERNAL TABLE` da como resultado el mensaje de error External keyword not supported for table type ICEBERG (Palabra clave externa no admitida para el tipo de tabla ICEBERG). 

Para crear una tabla de Iceberg en Athena, establezca la propiedad de tabla `'table_type'` como `'ICEBERG'` en la cláusula `TBLPROPERTIES`, como en el siguiente resumen de sintaxis.

```
CREATE TABLE
  [db_name.]table_name (col_name data_type [COMMENT col_comment] [, ...] )
  [PARTITIONED BY (col_name | transform, ... )]
  LOCATION 's3://amzn-s3-demo-bucket/your-folder/'
  TBLPROPERTIES ( 'table_type' ='ICEBERG' [, property_name=property_value] )
```

Para obtener información sobre los tipos de datos que puede consultar en las tablas de Iceberg, consulte [Tipos de datos compatibles con las tablas de Iceberg en Athena](querying-iceberg-supported-data-types.md).

### Uso de particiones
<a name="querying-iceberg-partitioning"></a>

Para crear tablas de Iceberg con particiones, use la sintaxis `PARTITIONED BY`. Las columnas que se usan para la partición deben especificarse primero en las instrucciones de las columnas. Dentro de la cláusula `PARTITIONED BY`, no se debe incluir el tipo de columna. También puede definir [transformaciones de partición](https://iceberg.apache.org/spec/#partition-transforms) en la sintaxis `CREATE TABLE`. Para especificar varias columnas para la partición, sepárelas con el carácter coma (`,`), como en el siguiente ejemplo:

```
CREATE TABLE iceberg_table (id bigint, data string, category string)
  PARTITIONED BY (category, bucket(16, id))
  LOCATION 's3://amzn-s3-demo-bucket/your-folder/'
  TBLPROPERTIES ( 'table_type' = 'ICEBERG' )
```

En la siguiente tabla, se muestran las funciones de transformación de particiones disponibles.


****  

| Función | Descripción | Tipos admitidos | 
| --- | --- | --- | 
| year(ts) | Partición por año | date, timestamp | 
| month(ts) | Partición por mes | date, timestamp | 
| day(ts)  | Partición por día | date, timestamp | 
| hour(ts) | Partición por hora | timestamp | 
| bucket(N, col) | Partición por valor de hash mod N buckets. Este es el mismo concepto que el bucket de hash para tablas de Hive. | int, long, decimal, date, timestamp, string, binary  | 
| truncate(L, col) | Partición por valor truncado a L | int, long, decimal, string | 

Athena admite el particionamiento oculto de Iceberg. Para más información, consulte [Partición oculta de Iceberg](https://iceberg.apache.org/docs/latest/partitioning/#icebergs-hidden-partitioning) en la documentación de Apache Iceberg.

### Especificación de propiedades de tablas
<a name="querying-iceberg-table-properties"></a>

Esta sección describe las propiedades de la tabla que puedes especificar como pares valor de clave en la cláusula `TBLPROPERTIES` de la instrucción `CREATE TABLE`. Athena solo permite una lista predefinida de pares valor de clave en las propiedades de la tabla para crear o alterar tablas de Iceberg. En las siguientes tablas, se muestran las propiedades de la tabla que se pueden especificar. Para más información sobre las opciones de compactación, consulte [Optimización de las tablas de Iceberg](querying-iceberg-data-optimization.md) en este documento. Si desea que Athena incluya compatibilidad con una propiedad de configuración de tabla específica de código abierto, envíe sus comentarios a [athena-feedback@amazon.com](mailto:athena-feedback@amazon.com). 

***formato***


****  

|  |  | 
| --- |--- |
| Descripción | Formato de datos del archivo | 
| Valores de propiedad permitidos | Las combinaciones de formato de archivo y compresión compatibles varían en función de la versión del motor de Athena. Para obtener más información, consulte [Uso de la compresión de tablas de Iceberg](compression-support-iceberg.md). | 
| Valor predeterminado | parquet | 

***write\$1compression***


****  

|  |  | 
| --- |--- |
| Descripción | Códec de compresión de archivos | 
| Valores de propiedad permitidos | Las combinaciones de formato de archivo y compresión compatibles varían en función de la versión del motor de Athena. Para obtener más información, consulte [Uso de la compresión de tablas de Iceberg](compression-support-iceberg.md). | 
| Predeterminado |  La compresión de escritura predeterminada varía en función de la versión del motor de Athena. Para obtener más información, consulte [Uso de la compresión de tablas de Iceberg](compression-support-iceberg.md).  | 

***optimize\$1rewrite\$1data\$1file\$1threshold***


****  

|  |  | 
| --- |--- |
| Descripción | Configuración específica de optimización de datos. Si los archivos de datos que requieren optimización son menores que el límite determinado, los archivos no se reescriben. Esto permite acumular más archivos de datos para producir archivos más cercanos al tamaño objetivo y omitir cálculos innecesarios para ahorrar costos. | 
| Valores de propiedad permitidos | Un número positivo. Debe ser menos de 50. | 
| Predeterminado | 5 | 

***optimize\$1rewrite\$1delete\$1file\$1threshold***


****  

|  |  | 
| --- |--- |
| Descripción | Configuración específica de optimización de datos. Si los archivos de eliminación asociados a un archivo de datos son menores que el límite, el archivo de datos no se reescribe. Esto permite acumular más archivos de eliminación para cada archivo de datos para ahorrar costos. | 
| Valores de propiedad permitidos | Un número positivo. Debe ser menos de 50. | 
| Predeterminado | 2 | 

***vacuum\$1min\$1snapshots\$1to\$1keep***


****  

|  |  | 
| --- |--- |
| Descripción |  Cantidad mínima de instantáneas que se deben retener en la rama principal de una tabla. Este valor tiene prioridad sobre la propiedad `vacuum_max_snapshot_age_seconds`. Si el mínimo de instantáneas restantes tiene una antigüedad superior a la especificada por `vacuum_max_snapshot_age_seconds`, se conservan las instantáneas y se omite el valor de `vacuum_max_snapshot_age_seconds`.  | 
| Valores de propiedad permitidos | Un número positivo. | 
| Predeterminado | 1 | 

***vacuum\$1max\$1snapshot\$1age\$1seconds***


****  

|  |  | 
| --- |--- |
| Descripción | Antigüedad máxima de las instantáneas que se deben retener en la rama principal. Este valor se omite si el número mínimo restante de instantáneas especificado por vacuum\$1min\$1snapshots\$1to\$1keep es superior a la antigüedad especificada. Esta propiedad de comportamiento de la tabla corresponde a la propiedad history.expire.max-snapshot-age-ms de la configuración de Apache Iceberg. | 
| Valores de propiedad permitidos | Un número positivo. | 
| Predeterminado | 432 000 segundos (5 días) | 

***vacuum\$1max\$1metadata\$1files\$1to\$1keep***


****  

|  |  | 
| --- |--- |
| Descripción | Cantidad máxima de archivos de metadatos anteriores que se deben retener en la ramificación principal de la tabla. | 
| Valores de propiedad permitidos | Un número positivo. | 
| Predeterminado | 100 | 

***write\$1data\$1path\$1enabled***


****  

|  |  | 
| --- |--- |
| Descripción | Cuando se establece en true, la tabla Iceberg se crea con la propiedad write.data.path en lugar de con la propiedad obsoleta write.object-storage.path. Utilice esta opción para garantizar la compatibilidad con Iceberg 1.9.0 y versiones posteriores, que ya no admiten la propiedad obsoleta. | 
| Valores de propiedad permitidos | true, false | 
| Predeterminado | false | 

### Ejemplo de instrucción CREATE TABLE
<a name="querying-iceberg-example-create-table-statement"></a>

En el siguiente ejemplo, se crea una tabla de Iceberg que tiene tres columnas.

```
CREATE TABLE iceberg_table (
  id int,
  data string,
  category string) 
PARTITIONED BY (category, bucket(16,id)) 
LOCATION 's3://amzn-s3-demo-bucket/iceberg-folder' 
TBLPROPERTIES (
  'table_type'='ICEBERG',
  'format'='parquet',
  'write_compression'='snappy',
  'optimize_rewrite_delete_file_threshold'='10'
)
```

## Uso de la instrucción CREATE TABLE AS SELECT (CTAS)
<a name="querying-iceberg-creating-tables-ctas"></a>

Para obtener información sobre la creación de una tabla de Iceberg mediante la instrucción `CREATE TABLE AS`, consulte [CREATE TABLE AS](create-table-as.md), con especial atención a la sección [Propiedades de la tabla CTAS](create-table-as.md#ctas-table-properties).

## Uso de un rastreador de AWS Glue
<a name="querying-iceberg-creating-tables-crawler"></a>

Puede utilizar un rastreador de AWS Glue para registrar de forma automática sus tablas de Iceberg en AWS Glue Data Catalog. Si desea migrar desde otro catálogo de Iceberg, puede crear y programar un rastreador de AWS Glue y proporcionar las rutas de Amazon S3 en las que se encuentran las tablas de Iceberg. Puede especificar la profundidad máxima de las rutas de Amazon S3 que puede recorrer el rastreador de AWS Glue. Tras programar un rastreador de AWS Glue, este extrae la información del esquema y actualiza AWS Glue Data Catalog con los cambios del esquema cada vez que se ejecuta. El rastreador de AWS Glue admite la fusión de esquemas en todas las instantáneas y actualiza la ubicación más reciente del archivo de metadatos en AWS Glue Data Catalog. Para obtener más información, consulte [Catálogo de datos y rastreadores en AWS Glue](https://docs.aws.amazon.com/glue/latest/dg/catalog-and-crawler.html). 

# Consulta de los datos de las tablas de Iceberg
<a name="querying-iceberg-table-data"></a>

Para consultar un conjunto de datos Iceberg, utilice una instrucción `SELECT` estándar como la siguiente. Las consultas siguen la [especificación del formato v2](https://iceberg.apache.org/spec/#format-versioning) de Apache Iceberg y hacen la fusión en lectura tanto de la posición como de los borrados de igualdad.

```
SELECT * FROM [db_name.]table_name [WHERE predicate]
```

Para optimizar los tiempos de consulta, todos los predicados se empujan hacia abajo, hacia donde viven los datos.

Para obtener información sobre las consultas de viajes de versión y viajes en el tiempo, consulte [Hacer consultas de viaje en el tiempo y de viaje de versión](querying-iceberg-time-travel-and-version-travel-queries.md).

## Creación y consulta de vistas con tablas de Iceberg
<a name="querying-iceberg-views"></a>

Para crear y consultar vistas de Athena en tablas de Iceberg, utilice las vistas `CREATE VIEW` tal y como se describe en [Trabajo con vistas](views.md).

Ejemplo:

```
CREATE VIEW view1 AS SELECT * FROM iceberg_table
```

```
SELECT * FROM view1 
```

Si está interesado en utilizar la [especificación de vistas de Iceberg](https://github.com/apache/iceberg/blob/master/format/view-spec.md) para crear vistas, póngase en contacto con [athena-feedback@amazon.com](mailto:athena-feedback@amazon.com). 

## Consulta de los metadatos de las tablas de Iceberg
<a name="querying-iceberg-table-metadata"></a>

En una consulta `SELECT`, puede utilizar las siguientes propiedades después de *table\$1name* para consultar los metadatos de la tabla de Iceberg:
+ **\$1files**: muestra los archivos de datos actuales de una tabla.
+ **\$1manifests**: muestra los manifiestos de archivos actuales de una tabla.
+ **\$1history**: muestra el historial de una tabla.
+ **\$1partitions**: muestra las particiones actuales de una tabla.
+ **\$1snapshots**: muestra las instantáneas de una tabla.
+ **\$1refs**: muestra las referencias de una tabla.

### Ejemplos
<a name="querying-iceberg-table-metadata-syntax"></a>

En la siguiente instrucción se enumeran los archivos de una tabla de Iceberg.

```
SELECT * FROM "dbname"."tablename$files"
```

En la siguiente instrucción se enumeran los manifiestos de una tabla de Iceberg.

```
SELECT * FROM "dbname"."tablename$manifests" 
```

En la siguiente instrucción se muestra el historial de una tabla de Iceberg.

```
SELECT * FROM "dbname"."tablename$history"
```

En el siguiente ejemplo se muestran las particiones de una tabla de Iceberg.

```
SELECT * FROM "dbname"."tablename$partitions" 
```

En el siguiente ejemplo se muestran las instantáneas de una tabla de Iceberg.

```
SELECT * FROM "dbname"."tablename$snapshots" 
```

En el siguiente ejemplo se muestran las referencias de una tabla de Iceberg.

```
SELECT * FROM "dbname"."tablename$refs" 
```

## Uso del control de acceso detallado de Lake Formation
<a name="querying-iceberg-working-with-lf-fgac"></a>

La versión 3 del motor de Athena admite el control de acceso detallado de Lake Formation con tablas de Iceberg, incluido el control de acceso de seguridad de nivel de columna y fila. Este control de acceso funciona con consultas de viajes en el tiempo y con tablas que han realizado la evolución del esquema. Para obtener más información, consulte [Control de acceso detallado de Lake Formation y grupos de trabajo de Athena](lf-athena-limitations.md#lf-athena-limitations-fine-grained-access-control).

Si ha creado su tabla de Iceberg fuera de Athena, utilice la versión 0.13.0 o superior del [SDK de Apache Iceberg](https://iceberg.apache.org/releases/) para que la información de la columna de la tabla de Iceberg aparezca en el AWS Glue Data Catalog. Si la tabla de Iceberg no contiene información sobre columnas en AWS Glue, puede utilizar la instrucción [ALTER TABLE SET TBLPROPERTIES](querying-iceberg-alter-table-set-properties.md) de Athena o el último SDK de Iceberg para corregir la tabla y actualizar la información de la columna en AWS Glue. 

# Hacer consultas de viaje en el tiempo y de viaje de versión
<a name="querying-iceberg-time-travel-and-version-travel-queries"></a>

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
<a name="querying-iceberg-time-travel-queries"></a>

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
<a name="querying-iceberg-version-travel-queries"></a>

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
<a name="querying-iceberg-table-snapshot-id"></a>

Puede utilizar la clase [SnapshotUtil](https://iceberg.apache.org/javadoc/1.6.0/org/apache/iceberg/util/SnapshotUtil.html) 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
<a name="querying-iceberg-combining-time-and-version-travel"></a>

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

# Actualización de los datos de las tablas de Iceberg
<a name="querying-iceberg-updating-iceberg-table-data"></a>

Puede administrar los datos de las tablas de Iceberg directamente en Athena mediante consultas `INSERT`, `UPDATE` y `DELETE`. Cada transacción de administración de datos produce una nueva instantánea, que se puede consultar por medio de un viaje en el tiempo. Las instrucciones `UPDATE` y `DELETE` siguen la especificación de [eliminación de posiciones](https://iceberg.apache.org/spec/#position-delete-files) a nivel filas del formato Iceberg v2 y aplican el aislamiento de instantáneas.

**nota**  
Athena SQL no admite actualmente el enfoque de copia en escritura. Las operaciones `UPDATE`, `MERGE INTO` y `DELETE FROM` siempre utilizan el enfoque de combinación en lectura con eliminaciones posicionales, independientemente de las propiedades de tabla especificadas. En caso de haber configurado propiedades de tabla como `write.update.mode`, `write.merge.mode` o `write.delete.mode` para usar copia en escritura, las consultas no fallarán, ya que Athena las ignorará y seguirá utilizando combinación en lectura. 

Use los siguientes comandos para realizar operaciones de administración de datos en tablas de Iceberg.

**Topics**
+ [INSERT INTO](querying-iceberg-insert-into.md)
+ [DELETE](querying-iceberg-delete.md)
+ [UPDATE](querying-iceberg-update.md)
+ [MERGE INTO](querying-iceberg-merge-into.md)

# INSERT INTO
<a name="querying-iceberg-insert-into"></a>

Este comando inserta datos en una tabla de Iceberg. El comando `INSERT INTO` de Athena Iceberg se carga igual que las consultas actuales `INSERT INTO` para tablas de Hive externas según la cantidad de datos analizados. Para insertar datos en una tabla de Iceberg, use la siguiente sintaxis, donde la *consulta* puede ser `VALUES (val1, val2, ...)` o `SELECT (col1, col2, …) FROM [db_name.]table_name WHERE predicate`. Para obtener información sobre la sintaxis y la semántica de SQL, consulte [INSERT INTO](insert-into.md).

```
INSERT INTO [db_name.]table_name [(col1, col2, …)] query
```

Los siguientes ejemplos insertan valores en la tabla `iceberg_table`.

```
INSERT INTO iceberg_table VALUES (1,'a','c1')
```

```
INSERT INTO iceberg_table (col1, col2, ...) VALUES (val1, val2, ...)
```

```
INSERT INTO iceberg_table SELECT * FROM another_table
```

# DELETE
<a name="querying-iceberg-delete"></a>

El comando `DELETE` de Athena Iceberg escribe los archivos de eliminación de posición Iceberg en una tabla. Esto se conoce como eliminación de tipo fusionar al leer. En contraste con la eliminación de tipo copiar al escribir, una eliminación de tipo fusionar al leer es más eficiente porque no se reescriben los datos de los archivos. Cuando Athena lee los datos de Iceberg, fusiona los archivos de eliminación de posición de Iceberg con los archivos de datos para producir la última vista de una tabla. Para eliminar estos archivos de eliminación de posición, puede ejecutar la acción de compactación [REWRITE DATA](querying-iceberg-data-optimization.md#querying-iceberg-data-optimization-rewrite-data-action). Las operaciones `DELETE` se cobran según la cantidad de datos analizados. Para ver la sintaxis, consulte [DELETE](delete-statement.md).

En el siguiente ejemplo, se eliminan las filas de `iceberg_table` que tienen `c3` como valor de `category`.

```
DELETE FROM iceberg_table WHERE category='c3'
```

# UPDATE
<a name="querying-iceberg-update"></a>

El comando `UPDATE` de Athena Iceberg escribe los archivos de eliminación de posición de Iceberg y las filas recién actualizadas como archivos de datos en la misma transacción. Se puede considerar al comando `UPDATE` como una combinación de `INSERT INTO` y `DELETE`. Las operaciones `UPDATE` se cobran según la cantidad de datos analizados. Para ver la sintaxis, consulte [UPDATE](update-statement.md).

En el siguiente ejemplo, se actualizan los valores especificados en la tabla `iceberg_table`.

```
UPDATE iceberg_table SET category='c2' WHERE category='c1'
```

# MERGE INTO
<a name="querying-iceberg-merge-into"></a>

Actualiza, elimina o inserta filas en una tabla de Iceberg de forma condicional. Una sola instrucción puede combinar acciones de actualización, eliminación e inserción. Para ver la sintaxis, consulte [MERGE INTO](merge-into-statement.md).

**nota**  
`MERGE INTO` es transaccional y solo es compatible con las tablas de Apache Iceberg en la versión 3 del motor Athena.

El siguiente ejemplo elimina todos los clientes de la tabla `t` que se encuentran en la tabla de origen `s`.

```
MERGE INTO accounts t USING monthly_accounts_update s
ON t.customer = s.customer
WHEN MATCHED
THEN DELETE
```

En el siguiente ejemplo, se actualiza la tabla de destino `t` con la información del cliente de la tabla de origen `s`. Para las filas de clientes de la tabla `t` que tienen filas de clientes coincidentes en la tabla `s`, el ejemplo incrementa las compras de la tabla t. Si la tabla `t` no coincide con ninguna fila de clientes de la tabla `s`, en el ejemplo se inserta la fila de clientes de una tabla `s` a otra `t`.

```
MERGE INTO accounts t USING monthly_accounts_update s
    ON (t.customer = s.customer)
    WHEN MATCHED
        THEN UPDATE SET purchases = s.purchases + t.purchases
    WHEN NOT MATCHED
        THEN INSERT (customer, purchases, address)
              VALUES(s.customer, s.purchases, s.address)
```

El siguiente ejemplo actualiza condicionalmente la tabla de destino `t` con información de la tabla de origen `s`. El ejemplo elimina cualquier fila de destino coincidente cuya dirección de origen sea Centreville. Para todas las demás filas coincidentes, el ejemplo agrega las compras de origen y establece la dirección de destino en la dirección de origen. Si no hay ninguna coincidencia en la tabla de destino, el ejemplo inserta la fila de la tabla de origen.

```
MERGE INTO accounts t USING monthly_accounts_update s
    ON (t.customer = s.customer)
    WHEN MATCHED AND s.address = 'Centreville'
        THEN DELETE
    WHEN MATCHED
        THEN UPDATE
            SET purchases = s.purchases + t.purchases, address = s.address
    WHEN NOT MATCHED
        THEN INSERT (customer, purchases, address)
              VALUES(s.customer, s.purchases, s.address)
```

# Administración de tablas de Iceberg
<a name="querying-iceberg-managing-tables"></a>

Athena admite las siguientes operaciones de DDL de una tabla para tablas de Iceberg.

**Topics**
+ [ALTER TABLE RENAME](querying-iceberg-alter-table-rename.md)
+ [ALTER TABLE SET TBLPROPERTIES](querying-iceberg-alter-table-set-properties.md)
+ [ALTER TABLE UNSET TBLPROPERTIES](querying-iceberg-alter-table-unset-properties.md)
+ [DESCRIBE](querying-iceberg-describe-table.md)
+ [DROP TABLE](querying-iceberg-drop-table.md)
+ [SHOW CREATE TABLE](querying-iceberg-show-create-table.md)
+ [SHOW TBLPROPERTIES](querying-iceberg-show-table-properties.md)

# ALTER TABLE RENAME
<a name="querying-iceberg-alter-table-rename"></a>

Cambia el nombre de una tabla.

Dado que los metadatos de tabla de una tabla de Iceberg se almacenan en Simple Storage Service (Amazon S3), puede actualizar la base de datos y el nombre de la tabla de una tabla administrada de Iceberg sin afectar a la información subyacente de la tabla.

## Sinopsis
<a name="querying-iceberg-alter-table-rename-synopsis"></a>

```
ALTER TABLE [db_name.]table_name RENAME TO [new_db_name.]new_table_name
```

## Ejemplo
<a name="querying-iceberg-alter-table-rename-example"></a>

```
ALTER TABLE my_db.my_table RENAME TO my_db2.my_table2
```

# ALTER TABLE SET TBLPROPERTIES
<a name="querying-iceberg-alter-table-set-properties"></a>

Agrega propiedades a una tabla de Iceberg y establece sus valores asignados.

De acuerdo con las [especificaciones de Iceberg](https://iceberg.apache.org/#spec/#table-metadata-fields), las propiedades de la tabla se almacenan en el archivo de metadatos de la tabla de Iceberg en lugar de en el AWS Glue. Athena no acepta propiedades de tabla personalizadas. Consulte la sección [Especificación de propiedades de tablas](querying-iceberg-creating-tables.md#querying-iceberg-table-properties) para conocer los pares clave-valor permitidos. También puede utilizar `ALTER TABLE SET TBLPROPERTIES` y `ALTER TABLE UNSET TBLPROPERTIES` para establecer o eliminar las propiedades `write.data.path` y `write.object-storage.path` de la tabla Iceberg. Si desea que Athena incluya compatibilidad con una propiedad de configuración de tabla específica de código abierto, envíe sus comentarios a [athena-feedback@amazon.com](mailto:athena-feedback@amazon.com).

## Sinopsis
<a name="querying-iceberg-alter-table-set-properties-synopsis"></a>

```
ALTER TABLE [db_name.]table_name SET TBLPROPERTIES ('property_name' = 'property_value' [ , ... ])
```

## Ejemplo
<a name="querying-iceberg-alter-table-set-properties-example"></a>

```
ALTER TABLE iceberg_table SET TBLPROPERTIES (
  'format'='parquet',
  'write_compression'='snappy',
  'optimize_rewrite_delete_file_threshold'='10'
)
```

El siguiente ejemplo establece la propiedad `write.data.path` en una tabla Iceberg existente.

```
ALTER TABLE iceberg_table SET TBLPROPERTIES (
  'write.data.path'='s3://amzn-s3-demo-bucket/your-folder/data'
)
```

# ALTER TABLE UNSET TBLPROPERTIES
<a name="querying-iceberg-alter-table-unset-properties"></a>

Esto descarta las propiedades existentes de una tabla de Iceberg.

## Sinopsis
<a name="querying-iceberg-alter-table-unset-properties-synopsis"></a>

```
ALTER TABLE [db_name.]table_name UNSET TBLPROPERTIES ('property_name' [ , ... ])
```

## Ejemplo
<a name="querying-iceberg-alter-table-unset-properties-example"></a>

```
ALTER TABLE iceberg_table UNSET TBLPROPERTIES ('write_compression')
```

El siguiente ejemplo eelimina la propiedad `write.data.path` de una tabla Iceberg.

```
ALTER TABLE iceberg_table UNSET TBLPROPERTIES ('write.data.path')
```

# DESCRIBE
<a name="querying-iceberg-describe-table"></a>

Describe información de la tabla.

## Sinopsis
<a name="querying-iceberg-describe-table-synopsis"></a>

```
DESCRIBE [FORMATTED] [db_name.]table_name
```

Cuando se especifica la opción `FORMATTED`, la salida muestra información adicional, como la ubicación y las propiedades de la tabla.

## Ejemplo
<a name="querying-iceberg-describe-table-example"></a>

```
DESCRIBE iceberg_table
```

# DROP TABLE
<a name="querying-iceberg-drop-table"></a>

Esto descarta una tabla de Iceberg.

**aviso**  
Dado que las tablas de Iceberg se consideran tablas administradas en Athena, cuando se descarta una tabla Iceberg también se eliminan todos los datos de la tabla.

## Sinopsis
<a name="querying-iceberg-drop-table-synopsis"></a>

```
DROP TABLE [IF EXISTS] [db_name.]table_name
```

## Ejemplo
<a name="querying-iceberg-drop-table-example"></a>

```
DROP TABLE iceberg_table
```

# SHOW CREATE TABLE
<a name="querying-iceberg-show-create-table"></a>

Se muestra la instrucción DDL `CREATE TABLE` que se puede utilizar para recrear la tabla de Iceberg en Athena. Si Athena no puede reproducir la estructura de la tabla (por ejemplo, porque las propiedades de tabla personalizadas se especifican en la tabla), se genera el error UNSUPPORTED.

## Sinopsis
<a name="querying-iceberg-show-create-table-synopsis"></a>

```
SHOW CREATE TABLE [db_name.]table_name
```

## Ejemplo
<a name="querying-iceberg-show-create-table-example"></a>

```
SHOW CREATE TABLE iceberg_table
```

# SHOW TBLPROPERTIES
<a name="querying-iceberg-show-table-properties"></a>

Se muestra una o más propiedades de tabla de una tabla de Iceberg. Solo se muestran las propiedades de tabla compatibles con Athena.

## Sinopsis
<a name="querying-iceberg-show-table-properties-synopsis"></a>

```
SHOW TBLPROPERTIES [db_name.]table_name [('property_name')]
```

## Ejemplo
<a name="querying-iceberg-show-table-properties-example"></a>

```
SHOW TBLPROPERTIES iceberg_table
```

# Evolución del esquema de tabla de Iceberg
<a name="querying-iceberg-evolving-table-schema"></a>

Las actualizaciones de esquemas Iceberg son cambios de metadatos únicamente. No se modifican los archivos de datos cuando se realiza una actualización del esquema. 

El formato Iceberg admite los siguientes cambios de evolución del esquema:
+ **Agregar**: agrega una nueva columna a una tabla o `struct` anidada.
+ **Eliminar**: elimina una columna existente de una tabla o `struct` anidada.
+ **Renombrar**: cambia el nombre de una columna o campo existente en una `struct` anidada.
+ **Reordenar**: cambia el orden de columnas.
+  **Promoción de tipos**: amplía el tipo de una columna, campo de `struct`, clave de `map`, valor de `map`‭ o elemento de `list`. En la actualidad, se admiten los siguientes casos para las tablas de Iceberg: 
  + número entero a número entero grande
  + flotante a doble
  + aumento de la precisión de un tipo decimal

Puede utilizar las instrucciones DDL de esta sección para modificar el esquema de la tabla de Iceberg.

**Topics**
+ [ALTER TABLE ADD COLUMNS](querying-iceberg-alter-table-add-columns.md)
+ [ALTER TABLE DROP COLUMN](querying-iceberg-alter-table-drop-column.md)
+ [ALTER TABLE CHANGE COLUMN](querying-iceberg-alter-table-change-column.md)
+ [SHOW COLUMNS](querying-iceberg-show-columns.md)

# ALTER TABLE ADD COLUMNS
<a name="querying-iceberg-alter-table-add-columns"></a>

Agrega una o más columnas a una tabla de Iceberg existente.

## Sinopsis
<a name="querying-iceberg-alter-table-add-columns-synopsis"></a>

```
ALTER TABLE [db_name.]table_name ADD COLUMNS (col_name data_type [,...])
```

## Ejemplos
<a name="querying-iceberg-alter-table-add-columns-example"></a>

En el siguiente ejemplo, se agrega una columna `comment` de tipo `string` a una tabla de Iceberg.

```
ALTER TABLE iceberg_table ADD COLUMNS (comment string)
```

En el siguiente ejemplo, se agrega una columna `point` de tipo `struct` a una tabla de Iceberg.

```
ALTER TABLE iceberg_table 
ADD COLUMNS (point struct<x: double, y: double>)
```

En el siguiente ejemplo, se agrega una columna `points`, que es una matriz de estructuras, a una tabla de Iceberg.

```
ALTER TABLE iceberg_table 
ADD COLUMNS (points array<struct<x: double, y: double>>)
```

# ALTER TABLE DROP COLUMN
<a name="querying-iceberg-alter-table-drop-column"></a>

Esto descarta una columna de una tabla de Iceberg existente.

## Sinopsis
<a name="querying-iceberg-alter-table-drop-column-synopsis"></a>

```
ALTER TABLE [db_name.]table_name DROP COLUMN col_name
```

## Ejemplo
<a name="querying-iceberg-alter-table-drop-column-example"></a>

```
ALTER TABLE iceberg_table DROP COLUMN userid
```

# ALTER TABLE CHANGE COLUMN
<a name="querying-iceberg-alter-table-change-column"></a>

Cambia el nombre, el tipo, el orden o el comentario de una columna en una tabla de Iceberg.

**nota**  
`ALTER TABLE REPLACE COLUMNS` no se admite. Debido a que `REPLACE COLUMNS` elimina todas las columnas y, luego, agrega otras nuevas, no es compatible con Iceberg. `CHANGE COLUMN` es la sintaxis preferida para la evolución del esquema. 

## Sinopsis
<a name="querying-iceberg-alter-table-change-column-synopsis"></a>

```
ALTER TABLE [db_name.]table_name
  CHANGE [COLUMN] col_old_name col_new_name column_type 
  [COMMENT col_comment] [FIRST|AFTER column_name]
```

## Ejemplo
<a name="querying-iceberg-alter-table-change-column-example"></a>

```
ALTER TABLE iceberg_table CHANGE comment blog_comment string AFTER id
```

# SHOW COLUMNS
<a name="querying-iceberg-show-columns"></a>

Muestra las columnas de una tabla.

## Sinopsis
<a name="querying-iceberg-show-columns-synopsis"></a>

```
SHOW COLUMNS (FROM|IN) [db_name.]table_name
```

## Ejemplo
<a name="querying-iceberg-alter-table-change-column-example"></a>

```
SHOW COLUMNS FROM iceberg_table
```

# Otras operaciones de DDL en tablas de Iceberg
<a name="querying-iceberg-additional-operations"></a>

Además de las operaciones de evolución del esquema descritas en [Evolución del esquema de tabla de Iceberg](querying-iceberg-evolving-table-schema.md), también puede realizar las siguientes operaciones de DDL en las tablas de Apache Iceberg en Athena.

## Operaciones en el nivel de base de datos
<a name="querying-iceberg-additional-operations-database-level-operations"></a>

Cuando utiliza [DROP DATABASE](drop-database.md) con la opción `CASCADE`, también se eliminan todos los datos de la tabla de Iceberg. Las siguientes operaciones de DDL no tienen efecto en las tablas de Iceberg.
+ [CREATE DATABASE](create-database.md)
+ [ALTER DATABASE SET DBPROPERTIES](alter-database-set-dbproperties.md)
+ [SHOW DATABASES](show-databases.md)
+ [SHOW TABLES](show-tables.md)
+ [SHOW VIEWS](show-views.md)

## Operaciones relacionadas con la partición
<a name="querying-iceberg-additional-operations-partition-related-operations"></a>

Debido a que las tablas de Iceberg utilizan la [partición oculta](https://iceberg.apache.org/docs/latest/partitioning/#icebergs-hidden-partitioning), no tiene que trabajar directamente con particiones físicas. Como resultado, las tablas de Iceberg de Athena no admiten las siguientes operaciones de DDL relacionadas con particiones:
+ [SHOW PARTITIONS](show-partitions.md)
+ [ALTER TABLE ADD PARTITION](alter-table-add-partition.md)
+ [ALTER TABLE DROP PARTITION](alter-table-drop-partition.md)
+ [ALTER TABLE RENAME PARTITION](alter-table-rename-partition.md)

Si quiere ver la [evolución de las particiones](https://iceberg.apache.org/docs/latest/evolution/#partition-evolution) de Iceberg en Athena, envíe comentarios a [athena-feedback@amazon.com](mailto:athena-feedback@amazon.com).

## Descarga de las tablas de Iceberg
<a name="querying-iceberg-additional-operations-unload-iceberg-table"></a>

Las tablas de Iceberg se pueden descargar en los archivos de una carpeta de Amazon S3. Para obtener más información, consulte [UNLOAD](unload.md).

## MSCK REPAIR
<a name="querying-iceberg-additional-operations-msck-repair"></a>

Debido a que las tablas de Iceberg hacen un seguimiento de la información de diseño de la tabla, la ejecución de [MSCK REPAIR TABLE](msck-repair-table.md) como se hace con las tablas Hive no es necesaria y no es compatible.

# Optimización de las tablas de Iceberg
<a name="querying-iceberg-data-optimization"></a>

Athena proporciona varias características de optimización para mejorar el rendimiento de las consultas en las tablas de Apache Iceberg. A medida que se acumulan los datos, las consultas pueden volverse menos eficientes debido al aumento de la sobrecarga de procesamiento de archivos y al costo computacional que implica aplicar eliminaciones a nivel de fila almacenadas en los archivos de eliminación de Iceberg. Para abordar estos desafíos, Athena ayuda a los operadores de compactación manual y vaciado a optimizar la estructura de la tabla. Athena también trabaja con las estadísticas de Iceberg para permitir la optimización de las consultas en función de los costos y la indexación de columnas de Parquet para reducir los datos con precisión durante la ejecución de las consultas. Estas características funcionan en conjunto para reducir el tiempo de ejecución de las consultas, minimizar el escaneo de datos y reducir los costos. En este tema se describe cómo utilizar estas capacidades de optimización para mantener las consultas de alto rendimiento en las tablas de Iceberg.

## OPTIMIZE
<a name="querying-iceberg-data-optimization-rewrite-data-action"></a>

La acción de compactación `OPTIMIZE table REWRITE DATA` reescribe los archivos de datos en una disposición más optimizada en función de su tamaño y del número de archivos de eliminación asociados. Para obtener detalles sobre la sintaxis y las propiedades de la tabla, consulte [OPTIMIZE](optimize-statement.md).

### Ejemplo
<a name="querying-iceberg-data-optimization-example"></a>

El siguiente ejemplo fusiona archivos de borrado en archivos de datos y produce archivos cercanos al tamaño de archivo objetivo cuando el valor de `category` es `c1`.

```
OPTIMIZE iceberg_table REWRITE DATA USING BIN_PACK
  WHERE category = 'c1'
```

## VACUUM
<a name="querying-iceberg-vacuum"></a>

`VACUUM` lleva a cabo el [vencimiento de las instantáneas](https://iceberg.apache.org/docs/latest/spark-procedures/#expire_snapshots) y la [eliminación de archivos huérfanos](https://iceberg.apache.org/docs/latest/spark-procedures/#remove_orphan_files). Estas acciones reducen el tamaño de los metadatos y eliminan los archivos que no están en el estado actual de la tabla y que también tienen una antigüedad superior al periodo de retención especificado para la tabla. Para obtener detalles sobre la sintaxis, consulte [VACUUM](vacuum-statement.md).

### Ejemplo
<a name="querying-iceberg-vacuum-example"></a>

En el siguiente ejemplo, se usa una propiedad de tabla para configurar la tabla `iceberg_table` de manera que retenga los datos de los últimos tres días y, a continuación, `VACUUM` se usa para hacer vencer las instantáneas antiguas y eliminar los archivos huérfanos de la tabla.

```
ALTER TABLE iceberg_table SET TBLPROPERTIES (
  'vacuum_max_snapshot_age_seconds'='259200'
)

VACUUM iceberg_table
```

## Uso de las estadísticas de tablas de Iceberg
<a name="querying-iceberg-data-optimization-statistics"></a>

El optimizador basado en costos de Athena utiliza las estadísticas de Iceberg para producir planes de consultas óptimos. Cuando se generan estadísticas para las tablas de Iceberg, Athena utiliza automáticamente esta información para tomar decisiones inteligentes sobre el orden de las uniones, los filtros y el comportamiento de agregación, lo que a menudo mejora el rendimiento de las consultas y reduce los costos.

Las estadísticas de Iceberg están activadas de forma predeterminada cuando se utilizan tablas de S3. Para otras tablas de Iceberg, Athena usa la propiedad `use_iceberg_statistics` de la tabla para determinar si debe aprovechar las estadísticas para la optimización basada en los costos. Para empezar, consulte [Optimización del rendimiento de las consultas mediante estadísticas de columnas](https://docs.aws.amazon.com//glue/latest/dg/column-statistics.html) en la *Guía del usuario de AWS Glue* o utilice la [consola de Athena](https://docs.aws.amazon.com/athena/latest/ug/cost-based-optimizer.html) para generar estadísticas bajo demanda en las tablas de Iceberg.

## Uso de la indexación de columnas de Parquet
<a name="querying-iceberg-data-optimization-parquet-column-indexing"></a>

La indexación de columnas de Parquet permite a Athena realizar una depuración de datos más precisa durante la ejecución de la consulta al aprovechar las estadísticas mínimas/máximas a nivel de página, además de las estadísticas a nivel de grupo de filas. Esto permite a Athena omitir páginas innecesarias dentro de los grupos de filas, lo que reduce significativamente la cantidad de datos escaneados y mejora el rendimiento de las consultas. Funciona mejor para consultas con predicados de filtros selectivos en columnas ordenadas, lo que mejora tanto el tiempo de ejecución como la eficiencia del escaneo de datos y, al mismo tiempo, reduce la cantidad de datos que Athena necesita leer de Amazon S3.

Athena usa los índices de columnas de Parquet de forma predeterminada con las tablas de S3 si los índices de columnas están presentes en los archivos de Parquet subyacentes. Para otras tablas de Iceberg, Athena utiliza la propiedad `use_iceberg_parquet_column_index` para determinar si debe utilizar los índices de columnas del archivo de Parquet. Establezca esta propiedad de la tabla mediante la consola de AWS Glue o la API `UpdateTable`.

# Consulta de vistas materializadas de AWS Glue Data Catalog
<a name="querying-iceberg-gdc-mv"></a>

Athena le permite consultar vistas materializadas de AWS Glue Data Catalog. Las vistas materializadas de Glue Data Catalog almacenan los resultados precalculados de las consultas SQL como tablas de Apache Iceberg.

Cuando crea vistas materializadas de Glue Data Catalog mediante Apache Spark en Amazon EMR o AWS Glue, las definiciones de la vista y sus metadatos se almacenan en AWS Glue Data Catalog. Los resultados precalculados se almacenan como tablas de Apache Iceberg en Amazon S3. Puede consultar estas vistas materializadas desde Athena mediante instrucciones `SELECT` SQL estándar, del mismo modo que consultaría tablas de Iceberg normales.

## Requisitos previos
<a name="querying-iceberg-gdc-mv-prerequisites"></a>

Antes de consultar vistas materializadas en Athena, asegúrese de lo siguiente:
+ La vista materializada existe en AWS Glue Data Catalog y se creó con Apache Spark (Amazon EMR versión 7.12.0 o posterior, o AWS Glue versión 5.1 o posterior)
+ Para consultar vistas materializadas en Athena, necesita los siguientes permisos AWS Lake Formation:
  + Permiso `SELECT` en la vista materializada
  + Permiso `DESCRIBE` en la vista materializada
  + Acceso a la ubicación de Amazon S3 subyacente donde se almacenan los datos de vista materializada
+ Los datos subyacentes de la vista materializada se almacenan en buckets de Tablas de Amazon S3 o en buckets de uso general de Amazon S3
+ Tiene acceso a la base de datos de AWS Glue Data Catalog que contiene la vista materializada
+ En el caso de las vistas materializadas almacenadas en los buckets de Tablas de Amazon S3, asegúrese de que su rol de IAM tenga los permisos necesarios para acceder al catálogo de tablas de S3.

## Consideraciones y limitaciones
<a name="querying-iceberg-gdc-mv-considerations"></a>
+ Athena no admite las siguientes operaciones para vistas materializadas: `ALTER`, `CREATE MATERIALIZED VIEW`, `REFRESH MATERIALIZED VIEW`, `DROP`, `INSERT`, `UPDATE`, `MERGE`, `DELETE`, `OPTIMIZE`, `VACUUM`. Para crear vistas materializadas, utilice Apache Spark en Amazon EMR o AWS Glue. Las operaciones de actualización se deben realizar a través de la API de AWS Glue Data Catalog o de Apache Spark. Modifique las vistas materializadas con Apache Spark.

## Consulta de vistas materializadas
<a name="querying-iceberg-gdc-mv-operations"></a>

Athena trata las vistas materializadas como tablas de Iceberg estándar para las operaciones de lectura, lo que le permite acceder a los datos precalculados sin necesidad de cambios especiales de sintaxis o configuración.

Para consultar una vista materializada en Athena, utilice instrucciones `SELECT` estándar:

```
SELECT * FROM my_database.sales_summary_mv;
```

Puede aplicar filtros, agregaciones y uniones tal como lo haría con las tablas normales:

```
SELECT
  region,
  SUM(total_sales) as sales_total
FROM my_database.sales_summary_mv
WHERE year = 2025
GROUP BY region
ORDER BY sales_total DESC;
```

## Operaciones admitidas
<a name="querying-iceberg-gdc-mv-supported"></a>

Athena no admite las siguientes operaciones en las vistas materializadas:
+ Consultas `SELECT`: leer datos de vistas materializadas mediante instrucciones `SELECT` SQL estándar
+ `DESCRIBE`: ver el esquema y los metadatos de las vistas materializadas
+ `SHOW TABLES`: enumerar las vistas materializadas junto con otras tablas de una base de datos
+ Operaciones `JOIN`: unir vistas materializadas con otras tablas o vistas
+ Filtrado y agregación: aplicar cláusulas `WHERE`, `GROUP BY` y agregar funciones

# Tipos de datos compatibles con las tablas de Iceberg en Athena
<a name="querying-iceberg-supported-data-types"></a>

Athena puede consultar las tablas de Iceberg que contienen los siguientes tipos de datos:

```
binary
boolean
date
decimal
double
float
int
list
long
map
string
struct
timestamp without time zone
```

Para más información sobre los tipos de tablas de Iceberg, consulte la [página de esquemas para Iceberg](https://iceberg.apache.org/docs/latest/schemas/) en la documentación de Apache.

En la siguiente tabla, se muestra la relación entre los tipos de datos de Athena y los tipos de datos de tabla de Iceberg.


****  
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/es_es/athena/latest/ug/querying-iceberg-supported-data-types.html)

Para más información sobre los tipos de datos en Athena, consulte [Tipos de datos en Amazon Athena](data-types.md).

# Recursos adicionales de
<a name="querying-iceberg-additional-resources"></a>

El siguiente artículo se encuentra en la documentación de Guía prescriptiva deAWS.
+ [Utilizar tablas de Apache Iceberg mediante SQL de Amazon Athena](https://docs.aws.amazon.com/prescriptive-guidance/latest/apache-iceberg-on-aws/iceberg-athena.html) 

Para ver artículos detallados sobre el uso de Athena con tablas de Apache Iceberg, consulte las siguientes publicaciones en el *Blog de macrodatos de AWS*.
+ [Implemente un proceso CDC sin servidor con Apache Iceberg mediante Amazon DynamoDB y Amazon Athena](https://aws.amazon.com/blogs/big-data/implement-a-serverless-cdc-process-with-apache-iceberg-using-amazon-dynamodb-and-amazon-athena/) 
+ [Acelerar la ingeniería de características de ciencia de datos en lagos de datos transaccionales mediante Amazon Athena con Apache Iceberg](https://aws.amazon.com/blogs/big-data/accelerate-data-science-feature-engineering-on-transactional-data-lakes-using-amazon-athena-with-apache-iceberg/) 
+ [Crear un lago de datos de Apache Iceberg mediante Amazon Athena, Amazon EMR y AWS Glue](https://aws.amazon.com/blogs/big-data/build-an-apache-iceberg-data-lake-using-amazon-athena-amazon-emr-and-aws-glue/) 
+ [Realizar cambios en un lago de datos mediante Amazon Athena y Apache Iceberg](https://aws.amazon.com/blogs/big-data/perform-upserts-in-a-data-lake-using-amazon-athena-and-apache-iceberg/) 
+ [Crear un lago de datos transaccional mediante Apache Iceberg y AWS Glue, y compartir datos entre cuentas con AWS Lake Formation y Amazon Athena](https://aws.amazon.com/blogs/big-data/build-a-transactional-data-lake-using-apache-iceberg-aws-glue-and-cross-account-data-shares-using-aws-lake-formation-and-amazon-athena/) 
+ [Utilizar Apache Iceberg en un lago de datos para respaldar el procesamiento incremental de datos](https://aws.amazon.com/blogs/big-data/use-apache-iceberg-in-a-data-lake-to-support-incremental-data-processing/) 
+ [Crear un lago de datos de Apache Iceberg en tiempo real alineado con el RGPD](https://aws.amazon.com/blogs/big-data/build-a-real-time-gdpr-aligned-apache-iceberg-data-lake/) 
+ [Automatizar la replicación de fuentes relacionales en un lago de datos transaccional con Apache Iceberg y AWS Glue](https://aws.amazon.com/blogs/big-data/automate-replication-of-relational-sources-into-a-transactional-data-lake-with-apache-iceberg-and-aws-glue/) 
+ [Interactuar con las tablas de Apache Iceberg mediante Amazon Athena y con permisos detallados entre cuentas con AWS Lake Formation](https://aws.amazon.com/blogs/big-data/interact-with-apache-iceberg-tables-using-amazon-athena-and-cross-account-fine-grained-permissions-using-aws-lake-formation/) 
+ [Crear un lago de datos transaccionales sin servidor con Apache Iceberg, Amazon EMR sin servidor y Amazon Athena](https://aws.amazon.com/blogs/big-data/build-a-serverless-transactional-data-lake-with-apache-iceberg-amazon-emr-serverless-and-amazon-athena/) 