尽管使用了过滤器,但在配置单元分区的S3数据集上,Pyarrow ParquetDataset.read()仍然很慢

尽管使用了filters标志,但是尝试从大型实木复合地板数据集中读取一天的信息非常慢。我使用过滤器的方式有问题吗?如果是这样,我该如何解决该问题?

我有一个庞大的镶木地板数据集,其中包含由配置单元配置的spark作业在S3中生成的数百万个文件。分区模式如下:

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路径,则运行速度非常快。不幸的是,这是行不通的,因为我经常想一次选择多天的数据,并且不想扫描整个数据集。我要解决的问题是拥有一个功能,该功能可以通过使用S3客户端列出目录来有效地自己实现过滤器。

其他信息:

  • 在Jupyter笔记本中进行测试时,第一次运行非常缓慢。后续运行的速度与我指定直到今天的S3路径的速度相同。我怀疑某种缓存是其原因。不幸的是,我需要第一次跑步才能表现出色。
compaq8510p 回答:尽管使用了过滤器,但在配置单元分区的S3数据集上,Pyarrow ParquetDataset.read()仍然很慢

TL; DR;我认为您提到的解决方法将是必需的(传递用于构造ParquetDataSet的路径列表)。

不幸的是,它在存储桶中显示filters are applied after discovering all partitions。因此,我相信,所花费的时间是建立分区列表,然后如您所述将其缓存。正在进行大量工作将这种逻辑推入C ++。快速浏览一下implementation,目前尚不清楚是否有逻辑可以更明智地执行此操作。可能需要公开一个JIRA问题来更好地在issue.apache.org上支持该用例,或者通过电子邮件将Apache Arrow dev邮件列表发送给讨论该用例。

本文链接:https://www.f2er.com/3098537.html

大家都在问