首页 > 解决方案 > Spark忽略加入中的显式广播提示

问题描述

在调查 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 将允许广播。

标签: apache-sparkapache-spark-sql

解决方案


Broadcasthashjoin 不适用于左外连接和全外连接。这是有充分理由的,如果有 2 个执行程序,可以说较小表中的 1 行不匹配,那么它应该在右侧带有空值的结果中吗?它不会在 Executor1 上知道 Executor2 上是否有匹配对,它无法在本地决定。


推荐阅读