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

如何用Polars Python API高效查询Parquet文件(按列筛选)

高效查询Parquet文件(Polars/FastParquet)

优先选择Polars:懒加载+高效查询

Polars的scan_parquet是懒加载模式,不会一次性把整个文件读入内存,只有当你调用collect()时才会实际执行查询、加载符合条件的数据,完美适配你的需求。

1. 获取指定名称的所有行

import polars as pl

# 创建懒加载的DataFrame(此时不读入任何数据)
lazy_df = pl.scan_parquet("your_file.parquet")

# 过滤name列等于目标值,最后collect()触发实际读取
filtered_all = lazy_df.filter(pl.col("name") == "target_name").collect()

# 输出结果
print(filtered_all)

2. 获取指定名称的首行

两种方式可选,按需使用:

# 返回单个Series(仅第一行数据)
filtered_first = lazy_df.filter(pl.col("name") == "target_name").first().collect()

# 返回一行的DataFrame(结构更完整)
filtered_first_df = lazy_df.filter(pl.col("name") == "target_name").head(1).collect()

print(filtered_first)

FastParquet实现方案(代码稍繁琐)

如果一定要用FastParquet,需要手动迭代文件的行组,逐块过滤数据,避免全量加载:

from fastparquet import ParquetFile
import pandas as pd

pf = ParquetFile("your_file.parquet")
filtered_rows = []

# 逐行组读取并过滤
for row_group in pf.iter_row_groups():
    # 读取当前行组的小数据块
    df_chunk = row_group.to_pandas()
    # 筛选符合条件的行
    matched = df_chunk[df_chunk["name"] == "target_name"]
    if not matched.empty:
        filtered_rows.append(matched)
        # 如果只需要首行,找到后直接终止循环
        # break

# 合并所有匹配的行(仅当需要所有行时)
result = pd.concat(filtered_rows)

# 获取首行(如果有匹配结果)
first_row = filtered_rows[0].iloc[0] if filtered_rows else None

对比总结

  • Polars的代码更简洁,查询效率更高,懒加载机制完全无需手动处理行组,推荐优先使用。
  • FastParquet需要手动迭代行组,代码复杂度高,适合特定场景下的自定义操作。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 05:24:21