避免广播嵌套循环联接

时间:2020-07-16 03:04:18

标签: apache-spark join

当我使用左联接这样联接两个数据框时:

df1.join(broadcast(df2), $"id" === $"id1" || $"id2" === $"id3", "left")

在没有$"id2" === $"id3"的情况下,它执行得非常快,但是当同时存在两种情况时,它就会变成BroadcastNestedLoopJoin,并且变得非常慢。

有什么想法可以改善这一点吗?

1 个答案:

答案 0 :(得分:3)

BroadcastNestedLoopJoin表示嵌套的for循环以连接您的数据帧。它总是会降低性能。

您可以尝试以下解决方案吗?

val resultPart1 = df1.join(broadcast(df2), $"id" === $"id1" ", "left")
val resultPart2 = df1.join(broadcast(df2),  $"id2" === $"id3", "left")

val resultDF = resultPart1.unionByName(resultPart2)

联合会导致执行器之间的数据混排为零,因此产生更快的结果