组合或附加到 pyarrow.dataset.expressions

问题描述 投票:0回答:2

我正在尝试使用 pyarrow.dataset 过滤 pyarrow 数据。我想添加一种动态方式来添加到表达式中。

from pyarrow import parquet as pq
import pyarrow.dataset as ds
import datetime

exp1 = ds.field("IntCol") == 1
exp2 = ds.field("StrCol") == 'A'
exp3 = ds.field("DateCol") == datetime.date.today()

filters = (exp1 & exp2 & exp3)
print(filters)

#To be used in reading parquet tables
df = pq.read_table('sample.parquet', filters=filters)

既然我可能有N个exp,那么如何在不写“&”的情况下做到这一点?我一直在寻找不同的方法来收集 np.logic_and.accumulate() 等表达式。它让我部分实现了目标,但我仍然需要将数组转换为单个表达式。

np.logical_and.accumulate([exp1, exp2, exp3])

out: array([<pyarrow.dataset.Expression (IntCol == 1)>,
       <pyarrow.dataset.Expression (StrCol == "A")>,
       <pyarrow.dataset.Expression (DateCol == 2021-06-09)>], dtype=object)

沿着 numpy 路线走可能不是最好的答案。有人建议这是否可以做到吗?

python expression pyarrow
2个回答
4
投票

您可以使用

operator.and_
获得与
&
运算符等效的功能。然后使用
functools.reduce
它可以递归地应用于表达式列表。

使用您的三个示例表达式:

import operator
import functools

>>> functools.reduce(operator.and_, [exp1, exp2, exp3])
<pyarrow.dataset.Expression (((IntCol == 1) and (StrCol == "A")) and (DateCol == 2021-06-10))>

0
投票

进一步建立@joris的答案,您可以通过

operator
的内置方法替换
pyarrow
函数。

import operator
import functools

>>> functools.reduce(operator.and_, [exp1, exp2, exp3])
<pyarrow.compute.Expression and_(and_((IntCol == 1), (StrCol == "A")), (DateCol == 2024-06-12))>
© www.soinside.com 2019 - 2024. All rights reserved.