我希望使用 AWS Athena 在我的 S3 数据湖中执行镶木地板压缩。基本上,我有许多小文件(例如每个 5-20 kb),我定期希望将它们组合成更大的文件(例如每个 512 MB)。这可以通过以下查询来完成:
CREATE TABLE database.new_table
WITH (
format = 'PARQUET',
parquet_compression = 'SNAPPY',
bucketed_by = ARRAY['my_column'],
bucket_count = 1
) AS
SELECT * FROM database.original_table
我的问题是生成的输出镶木地板文件不使用任何形式的行分组。下面是两个约 50 MB 的 parquet 文件的比较 - 我的原始模拟文件和由 Athena CTAS 查询创建的文件(MATLAB 的分析输出)。请注意,这些文件不包含完全相同的#observations,这在本例中是预期的。
>> parquetinfo("C:\Users\css\Downloads\00000000\00000000.parquet")
ans =
ParquetInfo with properties:
Filename: "C:\Users\css\Downloads\00000000\00000000.parquet"
FileSize: 56965797
NumRowGroups: 3
RowGroupHeights: [1000000 1000000 592000]
VariableNames: ["t" "a1" "a2"]
VariableTypes: ["datetime" "double" "double"]
VariableCompression: ["snappy" "snappy" "snappy"]
VariableEncoding: ["dictionary" "dictionary" "dictionary"]
Version: "2.0"
>> parquetinfo("C:\Users\css\Downloads\00000000\00000000_athena.parquet")
ans =
ParquetInfo with properties:
Filename: "C:\Users\css\Downloads\00000000\00000000_athena.parquet"
FileSize: 58940690
NumRowGroups: 1
RowGroupHeights: 2591476
VariableNames: ["t" "a1" "a2"]
VariableTypes: ["datetime" "double" "double"]
VariableCompression: ["snappy" "snappy" "snappy"]
VariableEncoding: ["dictionary" <missing> <missing>]
Version: "1.0"
>>
显然,Athena 创建的文件有许多差异(例如版本、变量编码等)。但重要的是,我的原始文件根据
RowGroupHeights
字段分为行组。 Athena CTAS 文件只有 1 组,等于 #observations 总数。
这意味着,在 Athena CTAS 输出文件(4 x 50 MB,总共 200 MB,计算所有数据的列的平均值)上运行时,我的查询速度慢了约 50%。如果我使用 Athena CTAS 将文件拆分为 11 个文件而不是 4 个文件,我会得到速度相当的结果,这强调了性能问题很可能与缺乏行分组有关。
有推荐的解决方法吗?我在 CTAS 查询语句中看不到任何用于指定块大小或行分组的选项。
我们得出的结论是,AWS Athena CTAS 压缩对于我们的用例来说并不理想,而是采用日期样式分区投影,如此处
所述