You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何分块读取Parquet文件?350GB大文件读取方法咨询

分块读取大体积Parquet文件的实现方案

当然支持分块读取Parquet文件啦!针对你这种350GB的超大Parquet文件,pyarrow其实提供了几种实用的分块读取方案,完全不用一次性把整个文件加载到内存里,我给你详细拆解下:

方法一:利用Parquet原生行组(Row Groups)读取

Parquet文件本身是按行组存储的,每个行组是独立的存储单元,这天然适合分块读取。你可以直接遍历文件的所有行组,逐个加载处理:

import pyarrow.parquet as pq
import pandas as pd

filepath = "your_large_350gb_file.parquet"
# 先打开Parquet文件对象
parquet_file = pq.ParquetFile(filepath)

# 遍历每个行组,逐一读取并转换为DataFrame
for row_group_idx in range(parquet_file.num_row_groups):
    # 读取单个行组
    table_chunk = parquet_file.read_row_group(row_group_idx)
    # 转换为Pandas DataFrame,保留你的原有参数
    df_chunk = table_chunk.to_pandas(integer_object_nulls=True)
    
    # 在这里添加你的chunk处理逻辑,比如数据分析、写入数据库等
    print(f"已处理第 {row_group_idx + 1}/{parquet_file.num_row_groups} 个行组,当前chunk行数:{len(df_chunk)}")

这种方式的优势是效率极高,因为直接利用了Parquet的存储结构,不需要额外的数据拆分操作,适合文件本身行组划分合理的场景。

方法二:自定义批次大小读取

如果你希望控制每个chunk的行数(比如固定每100万行一个批次),可以用pyarrow.dataset的迭代器来实现,更灵活:

import pyarrow.parquet as pq
import pyarrow.dataset as ds

filepath = "your_large_350gb_file.parquet"
# 创建Parquet数据集对象
parquet_dataset = ds.dataset(filepath, format="parquet")

# 按自定义批次大小迭代读取,这里设为100万行
for batch in parquet_dataset.to_batches(batch_size=1_000_000):
    df_chunk = batch.to_pandas(integer_object_nulls=True)
    
    # 处理当前chunk
    print(f"已处理一个批次,当前chunk行数:{len(df_chunk)}")

这个方法的好处是不用关心底层行组的大小,完全由你自己控制每个批次的数据量,适配各种业务需求。

额外优化建议

如果你的业务不需要加载文件的所有列,记得在读取时指定columns参数,能大幅减少每个chunk的内存占用:

# 示例:只读取需要的列
table_chunk = parquet_file.read_row_group(row_group_idx, columns=["user_id", "order_amount", "create_time"])
# 或者在dataset中指定
parquet_dataset = ds.dataset(filepath, format="parquet", columns=["user_id", "order_amount"])

这样处理大文件时内存压力会小很多,运行起来更顺畅。

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

火山引擎 最新活动