【发布时间】:2020-07-22 23:24:08
【问题描述】:
我正在看这个问题和出色的答案Spark: Explicit caching can interfere with Catalyst optimizer's ability to optimize some queries?
要点是:
val df = spark.range(100)
df.join(df, Seq("id")).filter('id <20).explain(true)
通过首先应用过滤为不使用索引的系统生成足够稳健的计划:
== Optimized Logical Plan ==
Project [id#16L]
+- Join Inner, (id#16L = id#18L)
:- Filter (id#16L < 20)
: +- Range (0, 100, step=1, splits=Some(8))
+- Filter (id#18L < 20)
+- Range (0, 100, step=1, splits=Some(8))
接下来的例子表明:
df.join(df, Seq("id")).cache.filter('id <20).explain(true)
生成此计划:
== Optimized Logical Plan ==
Filter (id#16L < 20)
+- InMemoryRelation [id#16L], StorageLevel(disk, memory, deserialized, 1 replicas)
+- *(2) Project [id#16L]
+- *(2) BroadcastHashJoin [id#16L], [id#21L], Inner, BuildRight
:- *(2) Range (0, 100, step=1, splits=8)
+- BroadcastExchange HashedRelationBroadcastMode(List(input[0, bigint, false])), [id=#112]
+- *(1) Range (0, 100, step=1, splits=8)
那么这个呢?
df.join(df, Seq("id")).filter('id <20).cache.explain(true)
生成:
== Optimized Logical Plan ==
InMemoryRelation [id#16L], StorageLevel(disk, memory, deserialized, 1 replicas)
+- *(1) Filter (id#16L < 20)
+- *(1) InMemoryTableScan [id#16L], [(id#16L < 20)]
+- InMemoryRelation [id#16L], StorageLevel(disk, memory, deserialized, 1 replicas)
+- *(2) Project [id#16L]
+- *(2) BroadcastHashJoin [id#16L], [id#21L], Inner, BuildRight
:- *(2) Range (0, 100, step=1, splits=8)
+- BroadcastExchange HashedRelationBroadcastMode(List(input[0, bigint, false])), [id=#112]
+- *(1) Range (0, 100, step=1, splits=8)
寻求澄清。
- 我原以为第一个 Opt Log Pl 将通过缓存作为最后一个方面获得。我怀疑一定很简单。是一样的吗?我认为不会。
【问题讨论】:
-
您好!您使用的是哪个版本的 Spark?我的本地 spark-shell 上有一个不同的 OLP,使用 Spark
2.4.4 -
245 在数据块上
-
将在 3 后尝试@BlueSheepToken
-
我回答了,希望这一切都有意义!在 Spark3 上,这是一个有趣的实验(完成了),但它会增加噪音以理解下推谓词
标签: apache-spark caching