【发布时间】:2018-10-05 18:20:39
【问题描述】:
为什么 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(...))
【问题讨论】:
-
不是开发人员,没有分析实现,但是排序从内存中卸载要简单得多。虽然理论上比创建散列结构稍微复杂一些,但从排序结构中获取下一行总是 O(1),如果你真的想将数据推送到磁盘,你可以使用单个文件描述符。如果您使用散列,则无法做到这一点。
-
如果我没记错的话,Spark 早早在 RDD shuffle 上做了类似的事情,通过从基于散列的切换到基于排序的洗牌。
-
为什么这被选为“主要基于意见”?问题不是“哪个更好”,而是“为什么选择它”,正如您所看到的,有一个很好的而不是主要基于意见的答案
标签: apache-spark join apache-spark-sql