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

如何用Polars的scan_parquet遍历关键词列表过滤Parquet文件

动态生成Polars分类过滤条件

针对你的需求,无需手动编写多个str.contains的OR逻辑,可通过两种方式动态生成过滤条件:

方法1:遍历列表生成表达式并合并

先遍历用户输入的分类列表,生成每个分类对应的str.contains表达式,再用逻辑OR合并所有条件:

from functools import reduce
import operator
import polars as pl

# 用户输入的动态分类列表
user_categories = ['nature', 'people', 'urban', ...]

# 生成每个分类的过滤表达式
category_conditions = [
    pl.col("CATEGORIES").str.contains(cat, literal=True) 
    for cat in user_categories
]

# 用OR合并所有条件
combined_condition = reduce(operator.or_, category_conditions)

# 执行扫描与过滤
filtered_df = (
    pl.scan_parquet(parquet_file)
    .filter(combined_condition)
    .filter(pl.col("MAX_WIDTH") >= HORIZONTAL_RES)
    .filter(pl.col("MAX_HEIGHT") >= VERTICAL_RES)
    .collect()
)

方法2:使用正则表达式一次性匹配(更高效)

把所有分类拼接成一个正则模式,只调用一次str.contains,性能更优,适合分类数量较多的场景:

import re
import polars as pl

# 用户输入的动态分类列表
user_categories = ['nature', 'people', 'urban', ...]

# 转义分类中的正则特殊字符(如.、*等),避免匹配异常
escaped_categories = [re.escape(cat) for cat in user_categories]
# 拼接成正则OR模式
category_pattern = "|".join(escaped_categories)

# 执行扫描与过滤
filtered_df = (
    pl.scan_parquet(parquet_file)
    .filter(pl.col("CATEGORIES").str.contains(category_pattern))
    .filter(pl.col("MAX_WIDTH") >= HORIZONTAL_RES)
    .filter(pl.col("MAX_HEIGHT") >= VERTICAL_RES)
    .collect()
)

注意事项

  • 如果分类字符串包含正则特殊字符(比如.、+),必须用re.escape转义,否则会导致匹配逻辑出错;
  • 方法2的性能优于方法1,因为只需要执行一次字符串匹配操作,适合大数据量场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 16:57:32