在左外连接之前过滤掉数据帧是否有帮助?

时间:2018-02-03 20:05:23

标签: apache-spark pyspark apache-spark-sql spark-dataframe

我只看到消息来源说这有助于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过滤器,但我想知道是否有更好的方法来过滤它。

1 个答案:

答案 0 :(得分:0)

TL; DR 没有数据就无法回答,但可能

如果您显着减少要洗牌的记录数,预过滤可以提高性能。要做到这一点:

  • 必须具有高度选择性。
  • 键列的大小是<<所有列的大小。

第一个是显而易见的。如果有减少,你什么都不搜索。 第二个是微妙的 - WHERE ... IN (SELECT ... FROM ...)需要一个shuffle,同样的连接。所以钥匙实际上已经洗了两次。

使用bloom过滤器可以更优雅地扩展(无需随机播放)。

如果您的记录数量有100倍的差异,那么考虑广播加入可能会更好。