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

如何低内存高效按组拆分Parquet文件以适配Hive分区?

大Parquet文件的Hive分区高效拆分方案

问题背景

有一个较大的Parquet格式DataFrame,需要拆分为多个文件实现Hive分区,要求无需加载全量数据到内存,同时兼顾处理速度。现有方案存在以下痛点:

  • PyArrow的dataset.write_dataset处理大文件时速度极慢;
  • Polars加载全量数据后用partition_by拆分速度快,但内存占用过高;
  • Polars LazyFrame反复过滤的方式内存占用低,但因多次扫描源文件导致速度拖沓。

示例数据集生成代码:

import polars as pl
from random import choice, randint
from string import ascii_letters

N = 10_000_000
pl.DataFrame({
    'id': [choice(ascii_letters) for _ in range(N)],
    'a': [randint(0, 100) for _ in range(N)],
}).write_parquet('stackoverflow.parquet')

最优解决方案:Polars LazyFrame 直接分区写入

Polars从0.18.0版本开始支持在write_parquet中直接指定partition_by参数,该方法基于LazyFrame实现,既无需加载全量数据到内存,又能利用Polars的并行处理能力保证速度,完美兼顾需求。

代码实现

import polars as pl

# 以懒加载方式读取源文件,不占用大量内存
lf = pl.scan_parquet('stackoverflow.parquet')
# 直接按指定字段分区写入,自动生成Hive风格目录结构
lf.write_parquet(
    'stackoverflow_data',
    partition_by='id',
    hive_partitioning=True  # 启用Hive规范的分区目录格式
)

方案优势

  • 低内存占用:全程基于LazyFrame批次处理数据,无需将全量数据加载到内存;
  • 高效速度:Polars内部优化了扫描与写入流程,避免反复读取源文件,同时利用多线程并行处理;
  • 自动适配Hive规范:通过hive_partitioning=True自动生成id=xxx格式的分区目录;
  • 简洁易维护:无需手动遍历分区值、创建目录,一行代码完成所有操作。

进阶配置(可选)

如果需要更精细的控制(比如压缩格式、文件大小),可添加额外参数:

lf.write_parquet(
    'stackoverflow_data',
    partition_by='id',
    hive_partitioning=True,
    compression='snappy',  # 指定压缩格式,平衡速度与体积
    row_group_size=1_000_000  # 控制每个文件的行组大小,调整单文件体积
)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 21:53:26