Duk*_*ver 5 apache-spark parquet
我将镶木地板文件按日期存储在以下目录中的分区中:
/activity
/date=20180802
Run Code Online (Sandbox Code Playgroud)
我正在使用 Spark 2.2 并且有 400 多个分区。我的理解是谓词下推应该允许我运行如下查询并获得快速结果。
spark.read.parquet(".../activity")
.filter($"date" === "20180802" && $"id" === "58ff800af2")
.show()
Run Code Online (Sandbox Code Playgroud)
但是,上面的查询大约需要 90 秒,而下面的查询大约需要 5 秒。我做错了什么还是这是预期的行为?
spark.read.parquet(".../activity/date=20180802")
.filter($"id" === "58ff800af2")
.show()
Run Code Online (Sandbox Code Playgroud)
我也注意到了这一点,并在 Spark Summit 演讲中谈到了这一点。
Spark 执行昂贵的文件列表操作,这确实会减慢速度。Spark 在列出文件方面确实很糟糕。我将 Spark 文件列出时间与 AWS CLI 进行了比较,但不知道为什么 Spark 列出文件需要这么长时间。
您应该将“我的理解是谓词下推...”改写为“我的理解是分区过滤器...”。谓词下推过滤是不同的。
这也是Delta Data Lakes 的一个问题。Delta 数据湖的情况实际上更糟,因为您提到的避免文件列表的解决方法不适用于 Delta。
简而言之,您没有做错任何事情,这是预期的行为。您只有 400 个分区,因此不必要的文件列表对于您的情况来说还算不错。想象一下,当您有 20,000 个分区时,这会变得多么慢!
| 归档时间: |
|
| 查看次数: |
3157 次 |
| 最近记录: |