使用 ZSTD 压缩级别
Zstandard 实时数据压缩算法
您可以根据自己的需求,使用 ZSTD 压缩级别来调整压缩比和速度。ZSTD 库支持的压缩级别为 1 到 22。Athena 默认使用的 ZSTD 压缩级别为 3。
通过压缩级别可以在压缩速度和要达到的压缩量之间进行精细平衡控制。压缩级别越低,速度越快,但文件越大。例如,在速度最为重要时,可以使用级别 1;在大小最为重要时,可以使用级别 22。默认设置为级别 3,适用于许多应用场景。使用大于 19 的级别时应当谨慎,因为这将需要更多内存。ZSTD 库还提供负压缩级别,从而扩展压缩速度和压缩比的范围。有关更多信息,请参阅 Zstandard 压缩 RFC
由于提供了多种压缩级别,因此可以充分进行微调优化。但在决定压缩级别时,请务必衡量您的数据量并相应权衡。我们建议使用默认级别 3 或介于 6 到 9 之间的级别,以便合理平衡压缩速度和压缩数据大小。20 及以上的级别应专用于大小最为重要且无需关注压缩速度的场景。
注意事项和限制
在 Athena 中使用 ZSTD 压缩级别时,请注意以下几点。
-
仅 Athena 引擎版本 3 支持 ZSTD
compression_level属性。 -
ALTER TABLE、CREATE TABLE、CREATE TABLE AS(CTAS)和UNLOAD语句支持 ZSTDcompression_level属性。 -
compression_level属性是可选的。 -
仅 ZSTD 压缩支持
compression_level属性。 -
可能的压缩级别为 1 到 22。
-
默认压缩级别为 3。
有关 Athena 中的 Apache Hive ZSTD 压缩支持的信息,请参阅 使用 Hive 表压缩。有关 Athena 中的 Apache Iceberg ZSTD 压缩支持的信息,请参阅 使用 Iceberg 表压缩。
指定 ZSTD 压缩级别
要为 ALTER TABLE、CREATE
TABLE、CREATE TABLE AS 和 UNLOAD 语句指定 ZSTD 压缩级别,请使用 compression_level 属性。要指定 ZSTD 压缩本身,您必须使用该语句的语法所用的单个压缩属性。
在 ALTER TABLE SET
TBLPROPERTIES 语句的 SET
TBLPROPERTIES 子句中,使用 'write.compression' = ' ZSTD' 或 'parquet.compression' =
'ZSTD' 指定 ZSTD 压缩。然后使用 compression_level 属性指定一个介于 1 到 22 之间的值(例如 'compression_level' = '5')。如果您未指定压缩级别属性,则压缩级别默认为 3。
示例
以下示例将修改表 existing_table 以使用 Parquet 文件格式以及 ZSTD 压缩和 ZSTD 压缩级别 4。请注意,在 TBLPROPERTIES 子句中,压缩级别值必须以字符串而不是整数形式输入,因此压缩级别值必须以单引号或双引号括起来。
ALTER TABLE existing_table SET TBLPROPERTIES ('parquet.compression' = 'ZSTD', 'compression_level' = '4')
在 CREATE TABLE 语句的 TBLPROPERTIES 子句中,指定 'write.compression' =
'ZSTD' 或 'parquet.compression' = 'ZSTD',然后使用 compression_level = 并指定一个介于 1 到 22 之间的值作为字符串。如果未指定 compression_levelcompression_level 属性,则默认压缩级别为 3。
示例
以下示例将以 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 语句的 WITH 子句中,指定 write_compression = 'ZSTD' 或 parquet_compression = 'ZSTD',然后使用 compression_level
= 并指定一个介于 1 到 22 之间的值作为整数。如果未指定 compression_levelcompression_level 属性,则默认压缩级别为 3。
示例
以下 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 语句的 WITH 子句中,指定 compression = 'ZSTD',然后使用 compression_level = 并指定一个介于 1 到 22 之间的值作为整数。如果未指定 compression_levelcompression_level 属性,则默认压缩级别为 3。
示例
以下示例将使用 Parquet 文件格式、ZSTD 压缩和 ZSTD 压缩级别 4 将查询结果卸载到指定位置。
UNLOAD (SELECT * FROM old_table) TO 's3://amzn-s3-demo-bucket/' WITH (format = 'PARQUET', compression = 'ZSTD', compression_level = 4)