我只看到消息来源说这有助于RDDs
,所以我想知道它是否对DataFrames
有帮助,因为Spark核心和火花SQL引擎的优化方式不同。
假设表1有6mil记录,我们加入表2,其中有600mil记录。我们将在表2的主键'key2'上加入这两个表。
如果我们打算这样做:
table 3 = table1.join(table2, 'key2', 'left_outer'),
在加入之前用WHERE table2.key2 IN table1.key2
过滤table2的600mil记录是否值得?如果是这样,最好的方法是什么?我知道DataFrame
LEFT SEMI JOIN
方法类似于WHERE IN
过滤器,但我想知道是否有更好的方法来过滤它。
答案 0 :(得分:0)
TL; DR 没有数据就无法回答,但可能。
如果您显着减少要洗牌的记录数,预过滤可以提高性能。要做到这一点:
第一个是显而易见的。如果有减少,你什么都不搜索。
第二个是微妙的 - WHERE ... IN (SELECT ... FROM ...)
需要一个shuffle,同样的连接。所以钥匙实际上已经洗了两次。
使用bloom过滤器可以更优雅地扩展(无需随机播放)。
如果您的记录数量有100倍的差异,那么考虑广播加入可能会更好。