Spark谓词下推性能

时间:2018-08-15 01:40:18

标签: apache-spark parquet

我有按日期存储在分区中的实木复合地板文件位于以下目录中:

/activity
    /date=20180802

我正在使用Spark 2.2,并且有400多个分区。我的理解是,谓词下推应允许我运行以下查询,并快速获得结果。

spark.read.parquet(".../activity")
    .filter($"date" === "20180802" && $"id" === "58ff800af2")
    .show()

但是,上面的查询大约需要90秒,而下面的查询大约需要5秒。 我是在做错什么还是这种预期的行为?

spark.read.parquet(".../activity/date=20180802")
    .filter($"id" === "58ff800af2")
    .show()

2 个答案:

答案 0 :(得分:2)

我也注意到了这一点,talked about it at a Spark Summit presentation

Spark执行昂贵的文件列出操作,这实际上会使速度变慢。 Spark确实不好列出文件。我已经将Spark文件的列出时间与AWS CLI进行了比较,但不知道为什么Spark需要这么长时间才能列出文件。

您应该将“我的理解是谓词下推...”改为“我的理解是分区过滤器...”。谓词下推过滤是不同的。

这也是an issue with Delta Data lakes。对于Delta数据湖,实际上情况更糟,因为您提到的避免文件列表的解决方法不适用于Delta。

简而言之,您没有做错任何事情,这是预期的行为。您只有400个分区,因此不必要的文件列表对您来说还不错。想象一下,当您有20,000个分区时,速度有多慢!

答案 1 :(得分:0)

尝试一下,看看谓词下推和分区修剪是否有效:

val df = spark.read.parquet(".../activity")
df.filter($"date" === "20180802" && $"id" === "58ff800af2").explain(true)

在生成的物理计划中查找PushedFilter [...]和PartitionFilters [...]。这将告诉您第一部分不起作用的原因。但是我不确定该如何解决,因为我面临着类似但又奇怪的事情,但尚未解决。