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

