为什么Spark Planner更喜欢通过混乱散列连接进行排序合并连接?

时间:2018-04-25 10:04:36

标签: apache-spark join apache-spark-sql

为什么Spark 2.3中的Spark Planner更喜欢通过混乱散列连接进行排序合并连接?换句话说,为什么spark.sql.join.preferSortMergeJoin配置属性internal and turned on by default?混乱散列连接有什么问题?这是Spark特有的,它是以分布式方式进行计算还是在连接算法中更固有的其他东西?

您可以找到JoinSelection执行计划策略herehere中使用的属性,如下所示:

case ... if !conf.preferSortMergeJoin && ... =>
  Seq(joins.ShuffledHashJoinExec(...))

1 个答案:

答案 0 :(得分:8)

为了回答你的问题

  

混洗哈希加入有什么问题?

我首先提供一些背景信息。

根据SPARK-11675混乱散列加入已在Spark 1.6中删除,原因是

  

...我认为我们现在应该为大型连接标准化排序合并连接,并在将来需要时创建更好的散列连接实现

并根据SPARK-13977重新引入Spark 2.0,因为

  

在以下情况下,ShuffledHashJoin仍然有用:

     

1)构建方的任何分区都可以适合内存

     

2)构建方面比流方小得多,较小的一侧的构建哈希表应该比对较大的一方分类更快。

值得一提的是SPARK-13​​977的PR,其中指出Shuffled Hash Join已被删除,有利于Sort Merge Join,更快更强大

我不确定与 Shuffled Hash Join 相比,排序合并加入的速度有多快,但由于随机散列加入需要,它的定义更加强大散列表适合内存,与Sort Merge Join相反,可以溢出到磁盘。