当我像这样使用左连接连接两个数据框时:
df1.join(broadcast(df2), $"id" === $"id1" || $"id2" === $"id3", "left")
没有$"id2" === $"id3",它执行得非常快,但是当这两个条件都存在时,它会BroadcastNestedLoopJoin变得非常慢。
有什么想法可以改进吗?
当我像这样使用左连接连接两个数据框时:
df1.join(broadcast(df2), $"id" === $"id1" || $"id2" === $"id3", "left")
没有$"id2" === $"id3",它执行得非常快,但是当这两个条件都存在时,它会BroadcastNestedLoopJoin变得非常慢。
有什么想法可以改进吗?
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)
联合导致跨执行者的数据零改组。因此产生更快的结果