如何分块读取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




