Spark目录查找分区过滤可以并行吗?

问题描述 投票:0回答:1

我有大量目录,并使用 Spark 分区过滤来读取 DataFrame。我发现我直接在文件系统上查找分区目录,我可以比 Spark 快至少一个数量级。我错过了什么吗?为什么 Spark 不并行查找目录? 比如说

/mydata/date=2020-09-01

/mydata/date=2020-09-02
等,我只想要
2020-09-28
2020-09-29
我可以:

val paths = List("/mydata/date=2020-09-28", "/mydata/date=2020-09-29") spark.read.format("parquet").option("basePath", "/mydata").load(paths: _*)

或者,我可以:

val dates = List("2020-09-28", "2020-09-29") spark.read.format("parquet").load("/mydata").filter($"date".isin(dates: _*))

在第一种情况下,我必须自己扫描目录以确保分区文件存在,否则如果缺少任何一个路径,
load

将失败“找不到文件”。

在第二种情况下,Spark 会为我扫描目录,并使用分区过滤打开最少数量的文件。

但是,如果目录数量很大,并且它们位于 S3 等慢速介质上,我可以通过使用并行集合来比 Spark 更快地查找目录。比如:

val goodPaths = paths.par.map(checkExist).toList

我宁愿让 Spark 做 Spark 擅长的事情,但是在单线程上像这样扫描 S3 速度慢得令人难以置信。我是否缺少一些配置选项来允许 Spark 使用节点的所有核心?

我在 Spark 2.x 和 3.x 上都看到了这一点。

scala apache-spark amazon-s3 parquet
1个回答
0
投票

spark.sql.sources.parallelPartitionDiscovery.threshold

默认为 32?

© www.soinside.com 2019 - 2024. All rights reserved.