结论:用 pandas.read_parquet() 最省事,但必须指定 engine="pyarrow";fastparquet 功能弱、不支持嵌套类型和并行读取;读大文件需列裁剪、filters 下推、use_threads=true 或改用 parquetdataset 分块读取。

直接说结论:用 pandas.read_parquet() 最省事,但背后必须指定 engine="pyarrow"(默认值在新版本已切换,老版本仍需显式写),否则可能报错或 silently 降级到 slower 的 engine。
为什么不用 fastparquet 引擎?
多数人装完 pandas 就直接 read_parquet(),结果遇到 ArrowNotImplementedError: Nested types not supported 或读取极慢——这往往是因为 pandas 在没装 pyarrow 时 fallback 到 fastparquet,而后者对嵌套结构(如 list
-
pyarrow是 Apache 官方参考实现,Parquet 规范兼容性最好,尤其适合大数据场景下的复杂 schema -
fastparquet内存占用略低,但功能滞后,且不支持use_threads=True并行读取(pyarrow支持) - 安装命令只需:
pip install pyarrow(无需额外配环境变量)
读大文件时怎么避免 OOM?
单个 Parquet 文件几百 GB 很常见,但 read_parquet() 默认把整个文件 load 进内存。别硬扛,用分块 + 列裁剪。
快速生成专业的 Python 脚本和应用代码。一键创建完整项目结构,支持CLI、API、爬虫、Bot、Django等多种项目类型,包含完整的项目结构、配置文件、依赖管理、测试、README和文档。
- 用
columns参数只读需要的列:pd.read_parquet("data.parq", columns=["user_id", "event_time"]) - 用
filters下推谓词(类似 SQL WHERE):filters=[("date", ">=", "2024-01-01"), ("status", "==", "active")] - 用
use_threads=True加速解码(默认开启,但显式写更安心) - 真正超大文件(>50GB)建议改用
pyarrow.parquet.ParquetDataset+read_table()手动控制 row group 级别读取
read_parquet() 常见参数陷阱
看似简单,几个参数不注意就会白跑半小时:
-
engine:pandas 2.0+ 默认是"pyarrow",但旧版(如 1.5.x)默认是"auto",会优先选fastparquet(如果已安装)。保险起见统一写成engine="pyarrow" -
use_nullable_dtypes:设为True可让 int 列自动转成Int64(支持 NaN),避免后续fillna(0)报错;但会略微增加内存开销 -
dtype参数对 Parquet 无效(schema 已固化),想强制类型得读完再.astype() - 路径含通配符(如
"data/*.parquet")时,pandas 自动调用pyarrow.dataset,此时filters依然生效,但columns必须是所有文件共有的列
最常被忽略的是:Parquet 文件的元数据(metadata)本身可能就占几百 MB——特别是分区多、row group 多的文件。用 pyarrow.parquet.read_metadata() 先 inspect 结构,比盲读安全得多。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










