

# Uso de la compresión en Athena
<a name="compression-formats"></a>

Athena admite una variedad de formatos de compresión para leer y escribir datos, como la lectura de una tabla que utiliza varios formatos de compresión. Por ejemplo, Athena puede leer correctamente los datos de una tabla que utiliza el formato de archivo Parquet cuando algunos archivos Parquet se comprimen con Snappy y otros archivos Parquet se comprimen con GZIP. El mismo principio se aplica a los formatos de almacenamiento ORC, archivo de texto y JSON.

## Formatos de compresión compatibles
<a name="compression-support-formats"></a>

Athena es compatible con los siguientes formatos de compresión:
+ **BZIP2**: formato que utiliza el algoritmo Burrows-Wheeler.
+ **DEFLATE**: algoritmo de compresión basado en [LZSS](https://en.wikipedia.org/wiki/Lempel%E2%80%93Ziv%E2%80%93Storer%E2%80%93Szymanski) y [codificación Huffman](https://en.wikipedia.org/wiki/Huffman_coding). [Deflate](https://en.wikipedia.org/wiki/Deflate) solo es relevante para el formato de archivo Avro.
+ **GZIP**: algoritmo de compresión basado en Deflate. Para las tablas de Hive en las versiones 2 y 3 del motor Athena y las tablas de Iceberg en la versión 2 del motor Athena, GZIP es el formato de compresión de escritura predeterminado para los archivos con formato de almacenamiento de archivo de texto y Parquet. Los archivos con el formato `tar.gz` no son compatibles.
+ **LZ4**: este miembro de la familia Lempel-Ziv 77 (LZ7) también se centra en la velocidad de compresión y descompresión en lugar de la máxima compresión de los datos. LZ4 tiene los siguientes formatos de encuadre:
  + **LZ4 Raw/Unframed** (LZ4 sin formato o sin encuadre): una implementación estándar y sin encuadre del formato de compresión de bloques LZ4. Para obtener más información, consulte [Descripción del formato de bloques LZ4](https://github.com/lz4/lz4/blob/dev/doc/lz4_Block_format.md) en GitHub.
  + **LZ4 framed** (LZ4 con encuadre): la implementación con el encuadre habitual de LZ4. Para obtener más información, consulte [Descripción del formato de encuadre LZ4](https://github.com/lz4/lz4/blob/dev/doc/lz4_Frame_format.md) en GitHub.
  + **LZ4 hadoop-compatible** (LZ4 compatible con Hadoop): la implementación con Apache Hadoop de LZ4. Esta implementación completa la compresión LZ4 con la clase [BlockCompressorStream.java](https://github.com/apache/hadoop/blob/f67237cbe7bc48a1b9088e990800b37529f1db2a/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/io/compress/BlockCompressorStream.java).
+ **LZO**: formato que utiliza el algoritmo Lempel–Ziv–Oberhumer, que se centra en la alta velocidad de compresión y descompresión en lugar de la compresión máxima de datos. LZO tiene dos implementaciones:
  + **LZO estándar**: para obtener más información, consulte el [resumen](http://www.oberhumer.com/opensource/lzo/#abstract) sobre LZO en el sitio web de Oberhumer.
  + **LZO hadoop-compatible** (LZO compatible con Hadoop): esta implementación completa el algoritmo de LZO con la clase [BlockCompressorStream.java](https://github.com/apache/hadoop/blob/f67237cbe7bc48a1b9088e990800b37529f1db2a/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/io/compress/BlockCompressorStream.java).
+ **SNAPPY**: algoritmo de compresión que forma parte de la familia Lempel-Ziv 77 (LZ7). Snappy se centra en la alta velocidad de compresión y descompresión en lugar de la máxima compresión de datos.
+ **ZLIB**: basado en Deflate, ZLIB es el formato de compresión de escritura predeterminado para archivos con el formato de almacenamiento de datos ORC. Para obtener más información, consulte la página [zlib](https://github.com/madler/zlib) en GitHub.
+  **ZSTD**: el [algoritmo de compresión de datos en tiempo real Zstandard](http://facebook.github.io/zstd/) es un algoritmo de compresión rápida que proporciona ratios altas de compresión. La biblioteca Zstandard (ZSTD) se proporciona como software de código abierto mediante una licencia BSD. ZSTD es la compresión predeterminada para las tablas de Iceberg. Cuando se escriben datos comprimidos con ZSTD, Athena utiliza el nivel 3 de compresión Zstandard. Para obtener información sobre el uso de los niveles de compresión ZSTD en Athena, consulte [Uso de niveles de compresión de ZSTD](compression-support-zstd-levels.md).

**nota**  
Athena no admite la escritura de archivos Parquet comprimidos con los formatos LZ4 o LZO. La lectura de estos formatos de compresión es compatible.

## Especificación de los formatos de compresión
<a name="compression-support-specifying-compression-formats"></a>

Al escribir instrucciones CREATE TABLE o CTAS, puede especificar las propiedades de compresión que especifican el tipo de compresión que se utilizará cuando Athena escriba en esas tablas.
+ Para CTAS, consulte [Propiedades de la tabla CTAS](create-table-as.md#ctas-table-properties). Para ver ejemplos, consulte [Ejemplos de consultas CTAS](ctas-examples.md).
+ Para obtener información sobre CREATE TABLE, consulte [ALTER TABLE SET TBLPROPERTIES](alter-table-set-tblproperties.md) para obtener una lista de las propiedades de la tabla de compresión.

## Especificación sin compresión
<a name="compression-support-specifying-no-compression"></a>

Las declaraciones CREATE TABLE permiten escribir archivos sin comprimir. Para escribir archivos sin comprimir, utilice la siguiente sintaxis: 
+ CREATE TABLE (archivo de texto o JSON): en `TBLPROPERTIES`, especifique `write.compression = NONE`.
+ CREATE TABLE (Parquet): en `TBLPROPERTIES`, especifique `parquet.compression = UNCOMPRESSED`.
+ CREATE TABLE (ORC): en `TBLPROPERTIES`, especifique `orc.compress = NONE`.

## Notas y recursos
<a name="compression-support-notes-and-resources"></a>
+ Actualmente, Athena no reconoce las extensiones de archivo en mayúsculas, como `.GZ` o `.BZIP2`. Evite utilizar conjuntos de datos con extensiones de archivo en mayúsculas o cambie el nombre de las extensiones de archivo de datos a minúsculas.
+ Para datos en CSV, TSV y JSON, Athena determina el tipo de compresión a partir de la extensión de archivo. Si no hay ninguna extensión de archivo, Athena trata los datos como texto sin formato y sin comprimir. Si los datos están comprimidos, asegúrese de que el nombre de archivo incluye la extensión de compresión como, por ejemplo, `gz`.
+ No se admite el formato de archivo ZIP.
+ Para consultar registros de Amazon Data Firehose desde Athena, los formatos admitidos incluyen la compresión GZIP o archivos ORC con compresión SNAPPY.
+ Para obtener más información sobre el uso de la compresión, consulte la sección 3, (“Comprimir y dividir archivos”), de la publicación del Blog de macrodatos de AWS [Los 10 consejos más importantes sobre el ajuste de rendimiento de Amazon Athena](https://aws.amazon.com/blogs/big-data/top-10-performance-tuning-tips-for-amazon-athena/).

**Topics**
+ [Especificación de los formatos de compresión](#compression-support-specifying-compression-formats)
+ [Especificación sin compresión](#compression-support-specifying-no-compression)
+ [Notas y recursos](#compression-support-notes-and-resources)
+ [Compresión de tablas de Hive](compression-support-hive.md)
+ [Compresión de tablas de Iceberg](compression-support-iceberg.md)
+ [Niveles de compresión ZSTD](compression-support-zstd-levels.md)

# Uso de compresión de tablas de Hive
<a name="compression-support-hive"></a>

Las opciones de compresión de las tablas de Hive en Athena varían según la versión del motor y el formato de archivo.

## Compatibilidad de compresión para Hive en la versión 3 del motor Athena
<a name="compression-support-hive-v3"></a>

En la siguiente tabla se resume la compatibilidad con formatos de compresión de la versión 3 del motor Athena para los formatos de archivo de almacenamiento de Apache Hive. El formato de archivo de texto incluye TSV, CSV, JSON y SerDes personalizado para texto. Los términos “Yes” (Sí) o “No” de una celda se aplican por igual a las operaciones de lectura y escritura, excepto donde se indique lo contrario. A los efectos de esta tabla, CREATE TABLE, CTAS e INSERT INTO se consideran operaciones de escritura. Para obtener información sobre el uso de los niveles de compresión ZSTD en Athena, consulte [Uso de niveles de compresión de ZSTD](compression-support-zstd-levels.md).


****  

|  | Avro | Ion | ORC | Parquet | Archivo de texto | 
| --- | --- | --- | --- | --- | --- | 
| BZIP2 | Sí | Sí | No | No | Sí | 
| DEFLATE | Sí | No | No | No | No | 
| GZIP | No | Sí | No | Sí | Sí | 
| LZ4 | No | Sí | Sí |  Escritura: no Lectura: sí  | Sí | 
| LZO | No |  Escritura: no Lectura: sí  | No |  Escritura: no Lectura: sí  |  Escritura: no Lectura: sí  | 
| SNAPPY | Sí | Sí | Sí | Sí | Sí | 
| ZLIB | No | No | Sí | No | No | 
| ZSTD | Sí | Sí | Sí | Sí | Sí | 
| NONE | Sí | Sí | Sí | Sí | Sí | 

# Uso de la compresión de tablas de Iceberg
<a name="compression-support-iceberg"></a>

Las opciones de compresión de las tablas de Iceberg en Athena varían según la versión del motor y el formato de archivo.

## Compatibilidad de compresión para Iceberg en la versión 3 del motor Athena
<a name="compression-support-iceberg-v3"></a>

En la siguiente tabla se resume la compatibilidad con formatos de compresión de la versión 3 del motor Athena para los formatos de archivo de almacenamiento de Apache Iceberg. Los términos “Yes” (Sí) o “No” de una celda se aplican por igual a las operaciones de lectura y escritura, excepto donde se indique lo contrario. A los efectos de esta tabla, CREATE TABLE, CTAS e INSERT INTO se consideran operaciones de escritura. El formato de almacenamiento predeterminado para Iceberg en la versión 3 del motor de Athena es Parquet. El formato de compresión predeterminado para Iceberg en la versión 3 del motor de Athena es ZSTD. Para obtener información sobre el uso de los niveles de compresión ZSTD en Athena, consulte [Uso de niveles de compresión de ZSTD](compression-support-zstd-levels.md).


****  

|  | Avro | ORC | Parquet (predeterminado) | 
| --- | --- | --- | --- | 
| BZIP2 | No | No | No | 
| GZIP | Sí | No | Sí | 
| LZ4 | No | Sí | No | 
| SNAPPY | Sí | Sí | Sí | 
| ZLIB | No | Sí | No | 
| ZSTD | Sí | Sí | Sí (predeterminado) | 
| NONE | Sí (especifique None o Deflate) | Sí | Sí (especifique None o Uncompressed) | 

# Uso de niveles de compresión de ZSTD
<a name="compression-support-zstd-levels"></a>

El [algoritmo de compresión de datos en tiempo real Zstandard](http://facebook.github.io/zstd/) es un algoritmo de compresión rápida que proporciona relaciones de compresión elevadas. La biblioteca Zstandard (ZSTD) es software de código abierto y utiliza una licencia BSD. Athena es compatible con la lectura y la escritura de datos de archivos de texto, Parquet y ORC comprimidos con ZSTD.

Puede utilizar los niveles de compresión ZSTD para ajustar la relación y velocidad de compresión de acuerdo con sus requisitos. La biblioteca ZSTD admite niveles de compresión comprendidos entre 1 y 22. Athena utiliza el nivel 3 de compresión ZSTD de manera predeterminada.

Los niveles de compresión permiten conseguir un equilibrio preciso entre la velocidad de compresión y la cantidad de compresión lograda. Los niveles de compresión más bajos proporcionan más velocidad, pero también tamaños de archivo más mayores. Por ejemplo, se puede utilizar el nivel 1 si la velocidad es la prioridad, y el nivel 22 si el tamaño es lo más importante. El nivel 3 es adecuado para muchos casos de uso, y es el predeterminado. Utilice los niveles superiores a 19 con precaución, ya que requieren más memoria. La biblioteca ZSTD también ofrece niveles de compresión negativos que amplían el intervalo de velocidades y relaciones de compresión. Para obtener más información, consulte el [documento RFC sobre compresión Zstandard](https://datatracker.ietf.org/doc/html/rfc8478).

La abundancia de niveles de compresión ofrece importantes posibilidades de realizar ajustes precisos. No obstante, asegúrese de medir los datos y tener en cuenta las ventajas y desventajas a la hora de decidir el nivel de compresión. Se recomienda utilizar el nivel predeterminado 3 o un nivel comprendido entre 6 y 9 para lograr un equilibrio razonable entre la velocidad de compresión y el tamaño de los datos comprimidos. Reserve los niveles de 20 y posteriores para aquellos casos en que el tamaño sea lo más importante y la velocidad de compresión no suponga un problema.

## Consideraciones y limitaciones
<a name="compression-support-zstd-levels-considerations-and-limitations"></a>

Cuando utilice los niveles de compresión ZSTD en Athena, tenga en cuenta los siguientes puntos.
+ La propiedad `compression_level` de ZSTD solo es compatible con la versión 3 del motor Athena.
+ La propiedad `compression_level` de ZSTD es compatible con las instrucciones `ALTER TABLE`, `CREATE TABLE` y `CREATE TABLE AS` (CTAS), y `UNLOAD`.
+ La propiedad `compression_level` es opcional.
+ La propiedad `compression_level` solo es compatible con la compresión ZSTD.
+ Los niveles de compresión posibles están comprendidos entre 1 y 22.
+ El nivel de compresión predeterminado es 3.

Para obtener información sobre la compatibilidad de compresión para Apache Hive ZSTD en Athena, consulte [Uso de compresión de tablas de Hive](compression-support-hive.md). Para obtener información sobre la compatibilidad de compresión para Apache Iceberg ZSTD en Athena, consulte [Uso de la compresión de tablas de Iceberg](compression-support-iceberg.md).

## Especificación de los niveles de compresión de ZSTD
<a name="compression-support-zstd-levels-specifying"></a>

Para especificar el nivel de compresión ZSTD de las instrucciones `ALTER TABLE`, `CREATE TABLE`, `CREATE TABLE AS` y `UNLOAD`, utilice la propiedad `compression_level`. Para especificar la compresión ZSTD propiamente dicha, debe utilizar la propiedad de compresión individual que utilice la sintaxis de la instrucción.

### ALTER TABLE SET TBLPROPERTIES
<a name="compression-support-zstd-levels-alter-table"></a>

En la cláusula `SET TBLPROPERTIES` de la instrucción [ALTER TABLE SET TBLPROPERTIES](alter-table-set-tblproperties.md), especifique la compresión ZSTD mediante `'write.compression' = ' ZSTD'` o `'parquet.compression' = 'ZSTD'`. Después, utilice la propiedad `compression_level` para especificar un valor comprendido entre 1 y 22 (por ejemplo, '`compression_level' = '5'`). Si no especifica ninguna propiedad de nivel de compresión, el nivel de compresión se establece en 3 de manera predeterminada.

#### Ejemplo
<a name="compression-support-zstd-levels-alter-table-example"></a>

En el siguiente ejemplo se modifica la tabla `existing_table` para que utilice el formato de archivo Parquet con compresión ZSTD y nivel 4 de compresión ZSTD. En la cláusula `TBLPROPERTIES`, el valor del nivel de compresión debe introducirse como una cadena y no como un entero y, por lo tanto, debe introducirse entre comillas simples o dobles.

```
ALTER TABLE existing_table 
SET TBLPROPERTIES ('parquet.compression' = 'ZSTD', 'compression_level' = '4')
```

### CREATE TABLE
<a name="compression-support-zstd-levels-create-table"></a>

En la cláusula `TBLPROPERTIES` de la instrucción [CREATE TABLE](create-table.md), especifique '`write.compression' = 'ZSTD'` o `'parquet.compression' = 'ZSTD'` y, a continuación, utilice `compression_level = compression_level` y especifique un valor comprendido entre 1 y 22 como una cadena. Si no se especifica la propiedad `compression_level`, el nivel de compresión predeterminado es 3.

#### Ejemplo
<a name="compression-support-zstd-levels-create-table-example"></a>

En el siguiente ejemplo se crea una tabla con formato de archivo Parquet mediante compresión ZSTD y el nivel 4 de compresión ZSTD. 

```
CREATE EXTERNAL TABLE new_table ( 
  `col0` string COMMENT '', 
  `col1` string COMMENT '' 
) 
STORED AS PARQUET 
LOCATION 's3://amzn-s3-demo-bucket/' 
TBLPROPERTIES ('write.compression' = 'ZSTD', 'compression_level' = '4')
```

### CREATE TABLE AS (CTAS)
<a name="compression-support-zstd-levels-ctas"></a>

En la cláusula `WITH` de la instrucción [CREATE TABLE AS](create-table-as.md), especifique `write_compression = 'ZSTD'` o `parquet_compression = 'ZSTD'` y, a continuación, utilice `compression_level = compression_level` y especifique un valor comprendido entre 1 y 22 como un entero. Si no se especifica la propiedad `compression_level`, el nivel de compresión predeterminado es 3.

#### Ejemplo
<a name="compression-support-zstd-levels-ctas-example"></a>

En el siguiente ejemplo de CTAS se especifica Parquet como formato de archivo mediante compresión ZSTD con un nivel de compresión 4. En la cláusula `WITH`, el valor del nivel de compresión debe especificarse como un entero, no como una cadena.

```
CREATE TABLE new_table  
WITH ( format = 'PARQUET', write_compression = 'ZSTD', compression_level = 4)  
AS SELECT * FROM old_table
```

### UNLOAD
<a name="compression-support-zstd-levels-unload"></a>

En la cláusula `WITH` de la instrucción [UNLOAD](unload.md), especifique `compression = 'ZSTD'` y, a continuación, utilice `compression_level = compression_level` y especifique un valor comprendido entre 1 y 22 como un entero. Si no se especifica la propiedad `compression_level`, el nivel de compresión predeterminado es 3.

#### Ejemplo
<a name="compression-support-zstd-levels-unload-example"></a>

En el siguiente ejemplo se descargan los resultados de la consulta en la ubicación especificada mediante el formato de archivo Parquet, compresión ZSTD y el nivel 4 de compresión ZSTD.

```
UNLOAD (SELECT * FROM old_table) 
TO 's3://amzn-s3-demo-bucket/' 
WITH (format = 'PARQUET', compression = 'ZSTD', compression_level = 4)
```