提问者:小点点

pyArrow可以过滤拼花结构和列表列吗?


将下表通过pyarrow存储到ApacheParquet中:

我想在加载数据时通过parquet过滤区域列。类似于这样:

import pyarrow.dataset as ds
dataset = ds.dataset("./example.parquet", format="parquet")
dataset.to_table(filter=ds.scalar('us').isin(ds.field('region')))

期望是我能回到第一排,但不是第二排。

但是,这不起作用。留档没有关于如何执行这种操作的任何有用信息。有没有办法对更复杂的列类型执行过滤器?


共1个答案

匿名用户

据我所知,从留档来看,你不能这么做。

支持的操作是

我认为你想要的是包含不支持的

您可以自己在箭头中实现它,但这有点麻烦:

import typing

import pandas as pd
import pyarrow as pa
from pyarrow import compute


def filter_list_column(table: pa.Table, column: str, value: typing.Any) -> pa.Table:
    flat_list = compute.list_flatten(table[column])
    flat_list_indices = compute.list_parent_indices(table[column])

    equal_mask = compute.equal(flat_list, value)
    equal_table_indices = compute.filter(flat_list_indices, equal_mask)
    return compute.take(table, equal_table_indices)


filter_list_column(table, "regions", "us")

这给了你: