对中位数大小火花数据帧的任何优化都会加入大型数据帧



我有一个中位数大小的数据帧A(大约 3000 万行(和一个巨大的数据帧(大约 200 亿行(。我必须在某个键上做A lefeOuterJoin B操作,比如说id.

val res = A.join(B, Seq("id"), "left_outer")

以下是一些更多信息:大表 B 中的id几乎不同,而 A 中有许多重复的id(某些键可能是百万大小(。直接联接 A 和 B 非常耗费资源,并且经常导致失败。那么,有没有办法优化此操作?

所以你说 B(大数据帧(中有很多不同的值,而在中型数据帧 A 中则更少。左联接表示您只对 A 中包含的一小组键感兴趣。您可以通过先过滤 B 来利用这一点。

val idsOfA = A.select("id").distinct //very small dataframe
val filteredB = B.join(functions.broadcast(idsOfA), Seq("id"))
val res = A.join(filteredB, Seq("id"), "left_outer")

由于 A 中有许多重复项,idsOfA 将非常小,因此可以广播。请注意,即使您不广播 idsOfA,联接仍然会产生比以前版本少得多的随机播放。

最新更新