pyarrow parquetdataset.read()在配置单元分区的s3数据集上运行缓慢,尽管使用了过滤器

n7taea2i  于 2021-06-25  发布在  Hive
关注(0)|答案(1)|浏览(372)

尽管使用了filters标志,但是尝试从一个大的parquet数据集中读取一天的数据是非常慢的。我使用过滤器有什么问题吗?如果是,我能做些什么来纠正这个问题?
我有一个很大的Parquet数据集,s3中有数百万个文件,这些文件是由一个spark作业生成的,这个作业是hive分区的。分区架构如下所示:

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路径到当天的运行速度相同。我怀疑是某种缓存造成的。不幸的是,我需要第一次跑步。

b1payxdu

b1payxdu1#

热释光;博士;我认为您提到的解决方法是必需的(传递路径列表以构建parquetdataset)。
不幸的是,在发现bucket中的所有分区之后,似乎应用了过滤器。因此,我相信,所花费的时间是建立分区列表,然后正如您所指出的那样,这些分区被缓存。要把这个逻辑推进c++还有很多工作要做。快速查看一下这个实现,目前还不清楚是否有逻辑来更智能地实现这个功能。也许值得在issues.apache.org上打开一个jira问题来更好地支持这个用例,或者通过电子邮件发送apachearrow dev邮件列表来讨论这个用例。

相关问题