使用 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内存的dask read_parquet爆炸
Azure Blob (pyarrow) 上的分区 Parquet 文件
使用 PyArrow + Parquet + Google Cloud Storage 时如何实现谓词下推?