相同输入数据下,Glue动态帧repartition比coalesce生成文件更大的原因
为何Glue动态帧repartition输出的Parquet文件总大小比coalesce更大?
我用相同输入数据,分别调用repartition和coalesce函数写入Parquet Snappy格式文件,代码如下:
glueContext.write_dynamic_frame.from_options( frame=df.repartition(nr_of_partition), # df.coalesce(nr_of_partition) connection_type="s3", connection_options={"path": s3_path, "partitionKeys": ["year", "month"]}, format="parquet", transformation_ctx="write_to_destination", )
结果发现coalesce的输出文件总大小小于repartition的输出,且两者输出行数一致,无重复数据。原本预期两者总文件大小相近,想知道原因。
Coalesce输出文件列表:
Repartition输出文件列表:
核心原因解析
数据重分布逻辑差异
coalesce仅合并现有小分区,不打乱数据原有分布,同一分区内的列数据保持原有聚集性;而repartition会全量洗牌数据,将数据均匀分配到新分区,彻底破坏了数据的局部相似性。Parquet压缩效率依赖数据聚集性
Parquet作为列存格式,Snappy压缩的效率高度依赖列数据的连续性和重复度。coalesce保留的数据聚集性让压缩算法能更高效地识别重复值、压缩连续数据;repartition打散后的数据,列值分散,压缩效果大幅下降,直接导致文件体积增大。分区统计信息的影响
Glue写入Parquet时会利用分区内的统计信息优化压缩策略。coalesce的分区是原有分区的合并,统计信息准确且完整,能更好指导压缩;repartition生成的新分区需要重新计算统计信息,优化程度不如前者,间接影响了压缩效果。
内容的提问来源于stack exchange,提问作者lin77
相关产品推荐
相关产品推荐

