使用 PyArrow + Parquet + Google Cloud Storage 时如何实现谓词下推?

Posted

技术标签:

【中文标题】使用 PyArrow + Parquet + Google Cloud Storage 时如何实现谓词下推?【英文标题】:How can I achieve predicate pushdown when using PyArrow + Parquet + Google Cloud Storage? 【发布时间】:2021-07-15 22:28:20 【问题描述】:

我真正想做的是(在 Python 中):

import pyarrow.parquet as pq

# Note the 'columns' predicate...
table = pq.read_table('gs://my_bucket/my_blob.parquet', columns=['a', 'b', 'c'])

首先,我认为 PyArrow 从 V3.0.0 开始不支持 gs://。 所以只好修改代码使用fsspec接口:https://arrow.apache.org/docs/python/filesystems.html

import pyarrow.parquet as pq
import gcsfs

fs = gcsfs.GCSFileSystem(project='my-google-project')
with fs.open('my_bucket/my_blob.parquet', 'rb') as file:
    table = pq.read_table(file.read(), columns=['a', 'b', 'c'])

这是否实现了谓词下推(我对此表示怀疑,因为我已经用 file.read() 准备好整个文件),还是有更好的方法来实现?

【问题讨论】:

你试过table = pq.read_table(file, columns=['a', 'b', 'c'])(没有read)。 read_table 支持“类文件对象”作为参数 【参考方案1】:

这行得通吗?

import pyarrow.parquet as pq
import gcsfs

fs = gcsfs.GCSFileSystem(project='my-google-project')
table = pq.read_table('gs://my_bucket/my_blob.parquet', columns=['a', 'b', 'c'], filesystem=fs)

【讨论】:

@user5406764 你能告诉我们这是否适合你 是的,这确实有效。我测试了将列设置为单个已知列而不是根本不指定列的加载时间。单列加载时间明显更快。

以上是关于使用 PyArrow + Parquet + Google Cloud Storage 时如何实现谓词下推?的主要内容,如果未能解决你的问题,请参考以下文章

如何用 pyarrow 编写 Parquet 元数据?

带有pyarrow内存的dask read_parquet爆炸

Azure Blob (pyarrow) 上的分区 Parquet 文件

使用 PyArrow + Parquet + Google Cloud Storage 时如何实现谓词下推?

如何使用 pyarrow 和 parquet 保存具有自定义类型的 pandas DataFrame

使用 pyarrow 从分区拼花数据集中读取特定分区