Spark中的广播哈希联接和广播嵌套循环联接有什么区别?

时间:2020-01-01 18:03:46

标签: apache-spark

Spark中的广播哈希联接和广播嵌套循环联接之间有什么区别? 在哪种情况下,spark会选择哪一个更快?

2 个答案:

答案 0 :(得分:4)

您可以从源代码中获取一些信息:https://github.com/apache/spark/blob/master/sql/core/src/main/scala/org/apache/spark/sql/execution/SparkStrategies.scala#L111

广播哈希联接(BHJ): 仅支持等联接,而联接键不需要可排序。除完全外部联接外,所有联接类型均受支持。 H 通常,当 广播面很小。但是,广播表是一个 网络密集型操作,可能会导致OOM或在 在某些情况下,尤其是在构建/广播方面很大的情况下。

广播嵌套循环联接(BNLJ): 同时支持等联接和非等联接。 支持所有联接类型,但是实现针对以下方面进行了优化: 1)在右侧外部联接中广播左侧; 2)在左外,左半,左反或存在连接中广播右侧; 3)以内部类似的方式广播任何一方。 对于其他情况,我们需要多次扫描数据,这可能会很慢。

答案 1 :(得分:2)

以下是Spark中Broadcast哈希联接和Broadcast嵌套循环联接的主要区别,

  • 广播哈希联接-广播联接将小数据复制到工作节点,这导致了高效和超快速的联接。当我们连接两个数据集并且其中一个数据集比另一个数据集小得多时(例如,当较小的数据集可以容纳到内存中时),则我们应该使用广播哈希连接。因此,在执行左连接,右连接和内部连接时,开发人员可以更有效地使用它。类似于地图侧联接。

  • 广播嵌套循环联接-在嵌套联接中,第一数据集的每一行都在其他数据集的每一行上进行迭代,这可能会降低联接操作的性能。但是在某些情况下,例如联接根据数据统计信息(大小或广播提示),键不固定,以及查询是否可以广播。如果它们都不被评估为true并且联接类型为内部,则使用CartesianProductExec执行查询。在这种情况下,将使用BroadcastNestedLoopJoinExec。根据数据集大小独立使用嵌套循环联接的地方之一是笛卡尔积产生的交叉联接。在这种情况下,如果未定义谓词,则返回左表中的每一行以及右表中的每一行。 Apache Spark使用org.apache.spark.sql.execution.joins.BroadcastNestedLoopJoinExec物理运算符为此类查询提供支持。当不能使用广播哈希联接,随机哈希联接或排序合并联接来执行联接语句时使用。