如何用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
相关产品推荐
相关产品推荐

