← 中文资源

简体中文版本

安全地合并多个 Parquet 文件

把大量小 Parquet 文件合并为较少的较大文件,降低元数据开销并提升扫描效率。

阅读英文原文

目标

流式任务产出成千上万个小 Parquet 文件,查询为每个文件付出元数据开销。本配方用 pyarrow 读取小文件目录并重写为合并后的数据集,用 zstd 压缩,得到更少更大的文件,随后核对行数完全一致以确保无数据丢失;提醒类型冲突需先统一 schema,合并会临时占用双倍磁盘。

步骤要点

  1. 读取小文件目录并重写为合并数据集。
  2. 核对合并前后行数完全一致。
  3. 先统一各文件 schema,避免类型冲突。
  4. 按分区分批合并以避免内存不足。
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 差异。
  • 不负责去重。