Parquet显著提升爬虫数据处理效率:支持字段投影减少90%磁盘读取、SNAPPY压缩使10GB CSV缩减至2–3GB、元数据min/max加速条件过滤;写入需指定pyarrow引擎、snappy压缩及index=False;大文件应使用谓词下推或RowGroup迭代读取。

因为爬虫数据量一旦上千万行,用 CSV 或 JSON 读取指定字段会拖慢查询速度、浪费磁盘IO、压缩率低——而 Parquet 能直接跳过无关列,只加载你 SELECT 的那几列,物理层面减少90%以上磁盘读取。
Parquet 对爬虫数据的三类刚需匹配最准
爬虫产出的数据天然适合 Parquet:字段固定、重复值多、查询常聚焦少数列(比如只查 title 和 source_url 做去重统计)。它不是“更好看”,而是解决三个具体问题:
- 字段投影:
pandas.read_parquet("data.parquet", columns=["title", "source_url"])真的只读这两列,其余几十个字段(如完整content文本)完全不碰磁盘 - 高压缩:同一列全是字符串或时间戳,
pyarrow默认用SNAPPY编码+字典压缩,实测 10GB 的爬虫CSV转成Parquet后通常剩 2–3GB - 元数据加速:每个
Row Group都存有该块内各列的min/max,执行df[df["crawl_time"] > "2026-01-01"]时,能直接跳过整块不符合的时间段
写入 Parquet 时必须注意的三个参数
用 pandas.to_parquet() 写爬虫数据,不设参数容易踩坑:
-
engine="pyarrow"必须显式指定——fastparquet对嵌套字段(如tags: list[str])支持弱,且默认不压缩 -
compression="snappy"推荐显式写上,"lz4"更快但压缩率略低,"gzip"压得更小但写入慢3–5倍 -
index=False务必加——爬虫数据不需要 pandas 行索引,保留它会额外存一列,还可能干扰后续 Spark 读取
读取大 Parquet 文件别直接 read_parquet()
单个文件超 5GB 时,全量读进内存风险高。实际做法是分块或按需读:
立即学习“Python免费学习笔记(深入)”;
- 用
pd.read_parquet("data.parquet", filters=[("status", "==", "success")])让谓词下推生效,跳过失败记录所在行组 - 用
pyarrow.parquet.ParquetFile手动迭代RowGroup,边读边处理,避免内存爆掉 - 如果要做字段统计,优先用
pyarrow.dataset.dataset().to_table(columns=["tag"]).to_pandas(),它比 pandas 接口更省内存
真正难的不是“怎么转成 Parquet”,而是爬虫 pipeline 中哪一步做转换、是否分区(比如按 crawl_date 分目录)、以及如何让下游工具(Spark / DuckDB)无缝复用这些文件——这些细节不提前设计,后期迁移成本远高于初期多写两行配置。


















