Spark 谓词下推性能
Spark predicate pushdown performance
我将 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()
试试这个,看看谓词下推和分区修剪是否有效:
val df = spark.read.parquet(".../activity")
df.filter($"date" === "20180802" && $"id" === "58ff800af2").explain(true)
在生成的物理计划中查找 PushedFilter[ ...] 和 PartitionFilters [ ...]。这将告诉您第一部分不起作用的原因。但我不确定如何解决它,因为我面临类似和奇怪的事情,但尚未解决。
我也注意到了这一点 talked about it at a Spark Summit presentation。
Spark 执行昂贵的文件列表操作,这确实会减慢速度。 Spark 非常不擅长列出文件。我已经将 Spark 文件列出时间与 AWS CLI 进行了比较,但不知道为什么 Spark 需要这么长时间才能列出文件。
您应该将 "My understanding is that predicate pushdown..." 改写为 "my understanding is that partition filters..."。谓词下推过滤不同
这也是an issue with Delta Data lakes。对于 Delta 数据湖,情况实际上更糟,因为您提到的避免文件列表的解决方法不适用于 Delta。
简而言之,您没有做错任何事,这是预期的行为。您只有 400 个分区,因此不必要的文件列表在您的情况下并不是那么糟糕。想象一下当您有 20,000 个分区时这会变得多慢!
我将 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()
试试这个,看看谓词下推和分区修剪是否有效:
val df = spark.read.parquet(".../activity")
df.filter($"date" === "20180802" && $"id" === "58ff800af2").explain(true)
在生成的物理计划中查找 PushedFilter[ ...] 和 PartitionFilters [ ...]。这将告诉您第一部分不起作用的原因。但我不确定如何解决它,因为我面临类似和奇怪的事情,但尚未解决。
我也注意到了这一点 talked about it at a Spark Summit presentation。
Spark 执行昂贵的文件列表操作,这确实会减慢速度。 Spark 非常不擅长列出文件。我已经将 Spark 文件列出时间与 AWS CLI 进行了比较,但不知道为什么 Spark 需要这么长时间才能列出文件。
您应该将 "My understanding is that predicate pushdown..." 改写为 "my understanding is that partition filters..."。谓词下推过滤不同
这也是an issue with Delta Data lakes。对于 Delta 数据湖,情况实际上更糟,因为您提到的避免文件列表的解决方法不适用于 Delta。
简而言之,您没有做错任何事,这是预期的行为。您只有 400 个分区,因此不必要的文件列表在您的情况下并不是那么糟糕。想象一下当您有 20,000 个分区时这会变得多慢!