【发布时间】:2021-10-28 16:01:54
【问题描述】:
在调查 Spark 作业的性能时,我在 Spark UI SQL DAG 视图中注意到正在执行 SortMergeJoin 而不是预期的 BroadcastHashJoin。
代码如下所示:
val df1 = // Some DataFrame
val df2 = // Some DataFrame
def df2Selected =
df2
.select(...)
df1
.join(
broadcast(df2Selected),
// join clause,
"left_outer"
)
但是 - 如果我修改 df2Selected 以添加 coalesce(1) 并重新运行,那么我会看到预期的 BroadcastHashJoin。
def df2Selected =
df2
.select(...)
.coalesce(1)
谁能告诉我这里发生了什么以及我是否可以在不合并的情况下强制广播?
我敢打赌,coalesce 以某种方式允许 Spark 推断从 df2Selected 返回的 DataFrame 的大小,因此 Spark 将允许广播。
【问题讨论】:
-
broadcast(df2Selected) -
抱歉 - 代码中的错字 - 我已更正以添加明确的广播提示。
-
根据我的经验,
org.apache.spark.sql.functions.broadcast()没有太多提示,它强制广播。因此,如果驱动程序在广播时内存不足或超时,作业确实会失败。 -
我发现完全一样,这就是为什么这种行为让我感到困惑。
标签: apache-spark apache-spark-sql