尽管使用过滤器,Pyarrow ParquetDataset.read() 在配置单元分区的 S3 数据集上速度很慢
Pyarrow ParquetDataset.read() is slow on a hive partitioned S3 dataset despite using filters
尝试从大型镶木地板数据集中读取一天的速度非常慢,尽管使用了过滤器标志。我使用过滤器的方式有问题吗?如果是这样,我可以做些什么来纠正这个问题?
我有一个大型镶木地板数据集,S3 中有数百万个文件,这些文件是由配置单元分区的 spark 作业生成的。分区架构如下所示:
s3://bucket-name/dataset-name/year=2019/month=5/day=23
代码如下:
import s3fs
import pyarrow.parquet as pq
s3_path = 's3://bucket-name/dataset-name'
s3 = s3fs.S3FileSystem()
hive_filter = [('year', '=', 2019), ('month', '=', 11), ('day', '=', 13)]
pyarrow_dataset = pq.ParquetDataset(s3_path, filesystem=s3, filters=hive_filter)
pyarrow_table = pyarrow_dataset.read()
如果我将 S3 路径指定到个别日期,这 运行 非常快。不幸的是,这行不通,因为我经常希望一次 select 多天的数据,并且不想扫描整个数据集。我的解决方法是拥有一个功能,通过使用 S3 客户端列出目录,我自己可以有效地实现过滤器。
附加信息:
- 在 Jupyter notebook 中测试时,第一个 运行 非常慢。随后的 运行s 与我指定 S3 路径时的速度相同。我怀疑某种缓存是造成这种情况的原因。不幸的是,我需要第一个 运行 表现出色。
TL;DR;我认为您提到的解决方法是必需的(传递路径列表以构建 ParquetDataSet)。
不幸的是,似乎 filters are applied after discovering all partitions in the bucket. So, I believe, the time being spent is building the list of partitions which then as you noted is cached. There is a lot of work on-going to push this logic into C++. Taking a quick look at that implementation 目前尚不清楚是否有逻辑可以更智能地执行此操作。可能值得在 issues.apache.org 上打开 JIRA 问题以更好地支持此用例,或通过电子邮件发送 Apache Arrow 开发邮件列表来讨论此用例。
尝试从大型镶木地板数据集中读取一天的速度非常慢,尽管使用了过滤器标志。我使用过滤器的方式有问题吗?如果是这样,我可以做些什么来纠正这个问题?
我有一个大型镶木地板数据集,S3 中有数百万个文件,这些文件是由配置单元分区的 spark 作业生成的。分区架构如下所示:
s3://bucket-name/dataset-name/year=2019/month=5/day=23
代码如下:
import s3fs
import pyarrow.parquet as pq
s3_path = 's3://bucket-name/dataset-name'
s3 = s3fs.S3FileSystem()
hive_filter = [('year', '=', 2019), ('month', '=', 11), ('day', '=', 13)]
pyarrow_dataset = pq.ParquetDataset(s3_path, filesystem=s3, filters=hive_filter)
pyarrow_table = pyarrow_dataset.read()
如果我将 S3 路径指定到个别日期,这 运行 非常快。不幸的是,这行不通,因为我经常希望一次 select 多天的数据,并且不想扫描整个数据集。我的解决方法是拥有一个功能,通过使用 S3 客户端列出目录,我自己可以有效地实现过滤器。
附加信息:
- 在 Jupyter notebook 中测试时,第一个 运行 非常慢。随后的 运行s 与我指定 S3 路径时的速度相同。我怀疑某种缓存是造成这种情况的原因。不幸的是,我需要第一个 运行 表现出色。
TL;DR;我认为您提到的解决方法是必需的(传递路径列表以构建 ParquetDataSet)。
不幸的是,似乎 filters are applied after discovering all partitions in the bucket. So, I believe, the time being spent is building the list of partitions which then as you noted is cached. There is a lot of work on-going to push this logic into C++. Taking a quick look at that implementation 目前尚不清楚是否有逻辑可以更智能地执行此操作。可能值得在 issues.apache.org 上打开 JIRA 问题以更好地支持此用例,或通过电子邮件发送 Apache Arrow 开发邮件列表来讨论此用例。