目标
流式任务产出成千上万个小 Parquet 文件,查询为每个文件付出元数据开销。本配方用 pyarrow 读取小文件目录并重写为合并后的数据集,用 zstd 压缩,得到更少更大的文件,随后核对行数完全一致以确保无数据丢失;提醒类型冲突需先统一 schema,合并会临时占用双倍磁盘。
步骤要点
- 读取小文件目录并重写为合并数据集。
- 核对合并前后行数完全一致。
- 先统一各文件 schema,避免类型冲突。
- 按分区分批合并以避免内存不足。
import pyarrow.dataset as ds
import pyarrow.parquet as pq
dataset = ds.dataset('small_files/', format='parquet')
pq.write_to_dataset(dataset, root_path='merged.parquet', compression='zstd')
排错提示
- schema 不一致会导致失败或静默强制转换。
- 重写会临时占用双倍磁盘。
- 合并不去重。
适用边界
- 需要先解决 schema 差异。
- 不负责去重。