You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Polars与PyArrow写入分区Parquet时体积异常增大问题排查

问题原因分析

1. 小文件冗余+压缩效率低下

你循环每个DataFrame单独写入分区时,每个DataFrame都会为每个part分区生成新的小文件(比如data0.parquet、data1.parquet...)。Parquet的压缩效率和数据块大小正相关,这些小文件的压缩率远低于原1GB级别的输入文件;同时,大量小文件的元数据开销也会额外占用存储空间,最终导致总体积暴涨。

2. 未配置合适的压缩算法

原代码未指定Parquet压缩策略,PyArrow默认的压缩设置可能和输入文件不一致(比如原文件用Snappy/Gzip压缩,输出默认未压缩或采用低效压缩方式),这也是体积剧增的关键因素。

高效实现方案

直接合并所有LazyFrame后一次性写入分区,避免多次写入的冗余开销,同时明确配置压缩算法:

import polars as pl
import glob

# 扫描所有Parquet文件并合并为单个LazyFrame
combined_lf = pl.concat([pl.scan_parquet(file) for file in glob.glob(input_path)])

# 一次性写入分区Parquet,启用高效压缩
combined_lf.write_parquet(
    output_path,
    use_pyarrow=True,
    pyarrow_options={
        "partition_cols": ["part"],
        "compression": "snappy"  # 可根据需求替换为"gzip"或"zstd",snappy兼顾速度与压缩率
    }
)

额外优化建议

  • 无需手动将LazyFrame收集为DataFrame:LazyFrame的write_parquet会懒执行,自动分批处理数据,避免内存过载。
  • 控制分区文件大小:可通过pyarrow_options添加row_group_size参数(比如row_group_size=1_000_000),让每个分区文件保持合适的体积,平衡压缩效率和后续读取性能。

内容的提问来源于stack exchange,提问作者Stephen Nicholson

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 10:52:07