当我使用左联接这样联接两个数据框时:
df1.join(broadcast(df2), $"id" === $"id1" || $"id2" === $"id3", "left")
在没有$"id2" === $"id3"
的情况下,它执行得非常快,但是当同时存在两种情况时,它就会变成BroadcastNestedLoopJoin
,并且变得非常慢。
有什么想法可以改善这一点吗?
答案 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)
联合会导致执行器之间的数据混排为零,因此产生更快的结果