为什么Spark 2.3中的Spark Planner更喜欢通过混乱散列连接进行排序合并连接?换句话说,为什么spark.sql.join.preferSortMergeJoin
配置属性internal and turned on by default?混乱散列连接有什么问题?这是Spark特有的,它是以分布式方式进行计算还是在连接算法中更固有的其他东西?
您可以找到JoinSelection
执行计划策略here和here中使用的属性,如下所示:
case ... if !conf.preferSortMergeJoin && ... =>
Seq(joins.ShuffledHashJoinExec(...))
答案 0 :(得分:8)
为了回答你的问题
混洗哈希加入有什么问题?
我首先提供一些背景信息。
根据SPARK-11675混乱散列加入已在Spark 1.6中删除,原因是
...我认为我们现在应该为大型连接标准化排序合并连接,并在将来需要时创建更好的散列连接实现
并根据SPARK-13977重新引入Spark 2.0,因为
在以下情况下,ShuffledHashJoin仍然有用:
1)构建方的任何分区都可以适合内存
2)构建方面比流方小得多,较小的一侧的构建哈希表应该比对较大的一方分类更快。
值得一提的是SPARK-13977的PR,其中指出Shuffled Hash Join已被删除,有利于Sort Merge Join,更快且更强大强>
我不确定与 Shuffled Hash Join 相比,排序合并加入的速度有多快,但由于随机散列加入需要,它的定义更加强大散列表适合内存,与Sort Merge Join相反,可以溢出到磁盘。