

# 在 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 文件。
+ 有关使用压缩的更多信息，请参阅 Amazon 大数据博客文章 [Top 10 performance tuning tips for Amazon Athena](https://www.amazonaws.cn/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)