组合或附加到 pyarrow.dataset.expressions
Combining or appending to pyarrow.dataset.expressions
我正在尝试使用 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.logical_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 路线可能不是最好的答案。有没有人建议这是否可以做到?
您可以使用 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))>
我正在尝试使用 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.logical_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 路线可能不是最好的答案。有没有人建议这是否可以做到?
您可以使用 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))>