

# 使用 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)
```