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

如何不手动写&即可动态拼接多个pyarrow.dataset过滤表达式

解决方案

方案1:使用functools.reduce拼接已有Expression对象

Python标准库的functools.reduce可以迭代处理列表中的所有元素,按指定的二元操作符拼接成单个结果,正好适配多表达式按逻辑与/或拼接的需求。

from pyarrow import parquet as pq
import pyarrow.dataset as ds
import datetime
from functools import reduce
import operator

# 动态生成的过滤表达式列表,可根据实际场景增删
exp_list = [
    ds.field("IntCol") == 1,
    ds.field("StrCol") == 'A',
    ds.field("DateCol") == datetime.date.today()
]

# 所有表达式按逻辑与拼接
filters = reduce(operator.and_, exp_list)

# 读取parquet
df = pq.read_table('sample.parquet', filters=filters)

如果需要逻辑或拼接,把operator.and_替换为operator.or_即可。

方案2:直接使用DNF格式过滤条件(更适合动态生成)

如果不需要提前构造Expression对象,还可以直接生成pyarrow支持的*析取范式(DNF)*格式的过滤列表,不需要手动处理表达式拼接,更适合从配置/外部输入动态生成过滤条件的场景。
DNF格式规则:

  • 内层列表中的每个元组是单个过滤条件,多个条件之间为逻辑与关系
  • 外层列表中的多个内层列表之间为逻辑或关系
from pyarrow import parquet as pq
import datetime

# 动态生成的逻辑与条件列表,可任意增删
and_conditions = [
    ("IntCol", "=", 1),
    ("StrCol", "=", "A"),
    ("DateCol", "=", datetime.date.today())
]
# 全逻辑与的场景,把条件列表套一层外层列表即可
filters = [and_conditions]

# 直接传入即可使用
df = pq.read_table('sample.parquet', filters=filters)

内容的提问来源于stack exchange,提问作者Ted. Z

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.17 12:45:02