

# 在 Athena 中使用压缩
<a name="compression-formats"></a>

Athena 支持多种用于读取和写入数据的压缩格式，例如从使用多种压缩格式的表中进行读取。例如，当某些 Parquet 文件使用 Snappy 压缩而其他 Parquet 文件使用 GZIP 压缩时，Athena 可以成功读取使用 Parquet 文件格式的表中的数据。同样的原则适用于 ORC、文本文件和 JSON 存储格式。

## 支持的压缩格式
<a name="compression-support-formats"></a>

Athena 支持以下压缩格式：
+ **BZIP2** – 使用 Burrows-Wheeler 算法的格式。
+ **DEFLATE** – 基于 [LZSS](https://en.wikipedia.org/wiki/Lempel%E2%80%93Ziv%E2%80%93Storer%E2%80%93Szymanski) 和 [Huffman 编码](https://en.wikipedia.org/wiki/Huffman_coding)的压缩算法。[Deflate](https://en.wikipedia.org/wiki/Deflate) 仅与 Avro 文件格式相关。
+ **GZIP** – 基于 Deflate 的压缩算法。对于 Athena 引擎版本 2 和 3 中的 Hive 表，以及 Athena 引擎版本 2 中的 Iceberg 表，GZIP 是 Parquet 和文本文件存储格式文件的默认写入压缩格式。不支持 `tar.gz` 格式的文件。
+ **LZ4** – 属于 Lempel-Ziv 77 (LZ7) 系列，并且也侧重于压缩和解压缩速度，而非对数据的最大限度压缩。LZ4 具有以下成帧格式：
  + **LZ4 Raw/Unframed** – LZ4 数据块压缩格式的标准无帧实现。有关更多信息，请参阅 GitHub 上的 [LZ4 数据块格式说明](https://github.com/lz4/lz4/blob/dev/doc/lz4_Block_format.md)。
  + **LZ4 Framed** – 常见的 LZ4 成帧实现。有关更多信息，请参阅 GitHub 上的 [LZ4 帧格式说明](https://github.com/lz4/lz4/blob/dev/doc/lz4_Frame_format.md)。
  + **LZ4 Hadoop-Compatible** – LZ4 的 Apache Hadoop 实现。此实现使用 [BlockCompressorStream.java](https://github.com/apache/hadoop/blob/f67237cbe7bc48a1b9088e990800b37529f1db2a/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/io/compress/BlockCompressorStream.java) 类封装 LZ4 压缩。
+ **LZO** – 使用 Lempel–Ziv–Oberhumer 算法的格式，该算法侧重于高速压缩和解压缩，而非对数据的最大限度压缩。LZO 具有两个实现：
  + **Standard LZO** – 有关更多信息，请参阅 Oberhumer 网站上的 LZO [摘要](http://www.oberhumer.com/opensource/lzo/#abstract)。
  + **LZO Hadoop-Compatible** – 此实现使用 [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 算法。
+ **SNAPPY** – 属于 Lempel-Ziv 77 (LZ7) 系列的压缩算法。Snappy 侧重于高速压缩和解压速度，而非对数据的最大限度压缩。
+ **ZLIB** – 基于 Deflate，ZLIB 是 ORC 数据存储格式文件的默认写入压缩格式。有关更多信息，请参阅 GitHub 上的 [zlib](https://github.com/madler/zlib) 页面。
+  **ZSTD** – [Zstandard 实时数据压缩算法](http://facebook.github.io/zstd/)是一种具有高压缩率的快速压缩算法。Zstandard（ZSTD）库作为使用 BSD 许可证的开源软件提供。ZSTD 是 Iceberg 表的默认压缩格式。在写入 ZSTD 压缩数据时，Athena 默认使用 ZSTD 压缩级别 3。有关在 Athena 中使用 ZSTD 压缩级别的更多信息，请参阅 [使用 ZSTD 压缩级别](compression-support-zstd-levels.md)。

**注意**  
Athena 不支持写入以 LZ4 或 LZO 格式压缩的 Parquet 文件。我们支持读取这些压缩格式。

## 指定压缩格式
<a name="compression-support-specifying-compression-formats"></a>

写入 CREATE TABLE 或 CTAS 语句时，您可以指定压缩属性，该属性可指定 Athena 写入这些表时要使用的压缩类型。
+ 对于 CTAS，请参阅 [CTAS 表属性](create-table-as.md#ctas-table-properties)。有关示例，请参阅 [CTAS 查询的示例](ctas-examples.md)。
+ 对于 CREATE TABLE，请参阅 [ALTER TABLE SET TBLPROPERTIES](alter-table-set-tblproperties.md) 以获取压缩表属性列表。

## 指定无压缩
<a name="compression-support-specifying-no-compression"></a>

CREATE TABLE 语句支持写入未压缩的文件。要写入未压缩的文件，请使用以下语法：
+ CREATE TABLE（文本文件或 JSON）– 在 `TBLPROPERTIES` 中，请指定 `write.compression = NONE`。
+ CREATE TABLE (Parquet) – 在 `TBLPROPERTIES` 中，请指定 `parquet.compression = UNCOMPRESSED`。
+ CREATE TABLE (ORC) – 在 `TBLPROPERTIES` 中，请指定 `orc.compress = NONE`。

## 注释和资源
<a name="compression-support-notes-and-resources"></a>
+ 目前，Athena 无法识别大写文件扩展名，例如 `.GZ` 或 `.BZIP2`。避免使用包含大写文件扩展名的数据集，或将数据文件扩展名重命名为小写。
+ 对于 CSV、TSV 和 JSON 格式的数据，Athena 根据文件扩展名确定压缩类型。如果不存在文件扩展名，则 Athena 将数据视为未压缩的纯文本。如果您的数据已压缩，请确保文件名包含压缩扩展名，例如 `gz`。
+ 不支持 ZIP 文件格式。
+ 对于从 Athena 查询 Amazon Data Firehose 日志，支持的格式包括 GZIP 压缩文件或采用 SNAPPY 压缩的 ORC 文件。
+ 有关使用压缩的更多信息，请参阅 AWS 大数据博客文章 [Top 10 performance tuning tips for Amazon Athena](https://aws.amazon.com/blogs/big-data/top-10-performance-tuning-tips-for-amazon-athena/)（Amazon Athena 的 10 大性能优化技巧）中的第 3 部分（“压缩和拆分文件”）。

**Topics**
+ [指定压缩格式](#compression-support-specifying-compression-formats)
+ [指定无压缩](#compression-support-specifying-no-compression)
+ [注释和资源](#compression-support-notes-and-resources)
+ [Hive 表压缩](compression-support-hive.md)
+ [Iceberg 表压缩](compression-support-iceberg.md)
+ [ZSTD 压缩级别](compression-support-zstd-levels.md)

# 使用 Hive 表压缩
<a name="compression-support-hive"></a>

Athena 中 Hive 表的压缩选项因引擎版本和文件格式而异。

## Athena 引擎版本 3 中的 Hive 压缩支持
<a name="compression-support-hive-v3"></a>

下表总结了对于 Apache Hive 存储文件格式，Athena 引擎版本 3 中支持的压缩格式。文本文件格式包括 TSV、CSV、JSON 和用于文本的自定义 SerDes。除非另有说明，否则单元格中的“是”或“否”同样适用于读取和写入操作。就本表而言，CREATE TABLE、CTAS 和 INSERT INTO 视为写入操作。有关在 Athena 中使用 ZSTD 压缩级别的更多信息，请参阅 [使用 ZSTD 压缩级别](compression-support-zstd-levels.md)。


****  

|  | Avro | Ion | ORC | Parquet | 文本文件 | 
| --- | --- | --- | --- | --- | --- | 
| BZIP2 | 支持 | 是 | 否 | 否 | 是 | 
| DEFLATE | 是 | 否 | 否 | 否 | 否 | 
| GZIP | 否 | 是 | 否 | 是 | 是 | 
| LZ4 | 否 | 是 | 是 |  写入 – 否 读取 – 是  | 是 | 
| LZO | 否 |  写入 – 否 读取 – 是  | 否 |  写入 – 否 读取 – 是  |  写入 – 否 读取 – 是  | 
| SNAPPY | 支持 | 是 | 是 | 是 | 是 | 
| ZLIB | 否 | 否 | 是 | 否 | 否 | 
| ZSTD | 支持 | 是 | 是 | 是 | 是 | 
| NONE | 支持 | 是 | 是 | 是 | 是 | 

# 使用 Iceberg 表压缩
<a name="compression-support-iceberg"></a>

Athena 中 Iceberg 表的压缩选项因引擎版本和文件格式而异。

## Athena 引擎版本 3 中的 Iceberg 压缩支持
<a name="compression-support-iceberg-v3"></a>

下表总结了对于 Apache Iceberg 存储文件格式，Athena 引擎版本 3 中支持的压缩格式。除非另有说明，否则单元格中的“是”或“否”同样适用于读取和写入操作。就本表而言，CREATE TABLE、CTAS 和 INSERT INTO 视为写入操作。在 Athena 引擎版本 3 中，适用于 Iceberg 的默认存储格式为 Parquet。在 Athena 引擎版本 3 中，适用于 Iceberg 的默认压缩格式为 ZSTD。有关在 Athena 中使用 ZSTD 压缩级别的更多信息，请参阅 [使用 ZSTD 压缩级别](compression-support-zstd-levels.md)。


****  

|  | Avro | ORC | Parquet（默认） | 
| --- | --- | --- | --- | 
| BZIP2 | 否 | 否 | 否 | 
| GZIP | 是 | 否 | 是 | 
| LZ4 | 否 | 是 | 否 | 
| SNAPPY | 支持 | 是 | 是 | 
| ZLIB | 否 | 是 | 否 | 
| ZSTD | 支持 | 是 | 是（默认） | 
| NONE | 是（请指定 None 或 Deflate） | 是 | 是（请指定 None 或 Uncompressed） | 

# 使用 ZSTD 压缩级别
<a name="compression-support-zstd-levels"></a>

[Zstandard 实时数据压缩算法](http://facebook.github.io/zstd/) 是一种具有高压缩比的快速压缩算法。Zstandard（ZSTD）库是一种开源软件，使用 BSD 许可证。Athena 支持读取和写入 ZSTD 压缩的 ORC、Parquet 和文本文件数据。

您可以根据自己的需求，使用 ZSTD 压缩级别来调整压缩比和速度。ZSTD 库支持的压缩级别为 1 到 22。Athena 默认使用的 ZSTD 压缩级别为 3。

通过压缩级别可以在压缩速度和要达到的压缩量之间进行精细平衡控制。压缩级别越低，速度越快，但文件越大。例如，在速度最为重要时，可以使用级别 1；在大小最为重要时，可以使用级别 22。默认设置为级别 3，适用于许多应用场景。使用大于 19 的级别时应当谨慎，因为这将需要更多内存。ZSTD 库还提供负压缩级别，从而扩展压缩速度和压缩比的范围。有关更多信息，请参阅 [Zstandard 压缩 RFC](https://datatracker.ietf.org/doc/html/rfc8478)。

由于提供了多种压缩级别，因此可以充分进行微调优化。但在决定压缩级别时，请务必衡量您的数据量并相应权衡。我们建议使用默认级别 3 或介于 6 到 9 之间的级别，以便合理平衡压缩速度和压缩数据大小。20 及以上的级别应专用于大小最为重要且无需关注压缩速度的场景。

## 注意事项和限制
<a name="compression-support-zstd-levels-considerations-and-limitations"></a>

在 Athena 中使用 ZSTD 压缩级别时，请注意以下几点。
+ 仅 Athena 引擎版本 3 支持 ZSTD `compression_level` 属性。
+ `ALTER TABLE`、`CREATE TABLE`、`CREATE TABLE AS`（CTAS）和 `UNLOAD` 语句支持 ZSTD`compression_level` 属性。
+ `compression_level` 属性是可选的。
+ 仅 ZSTD 压缩支持 `compression_level` 属性。
+ 可能的压缩级别为 1 到 22。
+ 默认压缩级别为 3。

有关 Athena 中的 Apache Hive ZSTD 压缩支持的信息，请参阅 [使用 Hive 表压缩](compression-support-hive.md)。有关 Athena 中的 Apache Iceberg ZSTD 压缩支持的信息，请参阅 [使用 Iceberg 表压缩](compression-support-iceberg.md)。

## 指定 ZSTD 压缩级别
<a name="compression-support-zstd-levels-specifying"></a>

要为 `ALTER TABLE`、`CREATE TABLE`、`CREATE TABLE AS` 和 `UNLOAD` 语句指定 ZSTD 压缩级别，请使用 `compression_level` 属性。要指定 ZSTD 压缩本身，您必须使用该语句的语法所用的单个压缩属性。

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

在 [ALTER TABLE SET TBLPROPERTIES](alter-table-set-tblproperties.md) 语句的 `SET TBLPROPERTIES` 子句中，使用 `'write.compression' = ' ZSTD'` 或 `'parquet.compression' = 'ZSTD'` 指定 ZSTD 压缩。然后使用 `compression_level` 属性指定一个介于 1 到 22 之间的值（例如 '`compression_level' = '5'`）。如果您未指定压缩级别属性，则压缩级别默认为 3。

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

以下示例将修改表 `existing_table` 以使用 Parquet 文件格式以及 ZSTD 压缩和 ZSTD 压缩级别 4。请注意，在 `TBLPROPERTIES` 子句中，压缩级别值必须以字符串而不是整数形式输入，因此压缩级别值必须以单引号或双引号括起来。

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

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

在 [CREATE TABLE](create-table.md) 语句的 `TBLPROPERTIES` 子句中，指定 '`write.compression' = 'ZSTD'` 或 `'parquet.compression' = 'ZSTD'`，然后使用 `compression_level = compression_level` 并指定一个介于 1 到 22 之间的值作为字符串。如果未指定 `compression_level` 属性，则默认压缩级别为 3。

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

以下示例将以 Parquet 文件格式创建一个表，并使用 ZSTD 压缩和 ZSTD 压缩级别 4。

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

在 [CREATE TABLE AS](create-table-as.md) 语句的 `WITH` 子句中，指定 `write_compression = 'ZSTD'` 或 `parquet_compression = 'ZSTD'`，然后使用 `compression_level = compression_level` 并指定一个介于 1 到 22 之间的值作为整数。如果未指定 `compression_level` 属性，则默认压缩级别为 3。

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

以下 CTAS 示例将指定使用 Parquet 文件格式以及 ZSTD 压缩和 ZSTD 压缩级别 4。请注意，在 `WITH` 子句中，压缩级别的值必须指定为整数，而不是字符串。

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

在 [UNLOAD](unload.md) 语句的 `WITH` 子句中，指定 `compression = 'ZSTD'`，然后使用 `compression_level = compression_level` 并指定一个介于 1 到 22 之间的值作为整数。如果未指定 `compression_level` 属性，则默认压缩级别为 3。

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

以下示例将使用 Parquet 文件格式、ZSTD 压缩和 ZSTD 压缩级别 4 将查询结果卸载到指定位置。

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