Spark 2.3のSpark Plannerはなぜシャッフルハッシュ結合よりもソートマージ結合を優先するのでしょうか?言い換えれば、なぜspark.sql.join.preferSortMergeJoin
構成プロパティ内蔵されており、デフォルトでオンになっています? シャッフルされたハッシュ結合の何が問題なのでしょうか? これは、分散形式で計算を実行するという Spark 特有のことでしょうか、それとも結合アルゴリズムに固有の何かでしょうか?
JoinSelection
実行計画戦略で使用されるプロパティを見つけることができますここそしてここそれは次のようになります:
case ... if !conf.preferSortMergeJoin && ... =>
Seq(joins.ShuffledHashJoinExec(...))
ベストアンサー1
あなたの質問に答えるために
シャッフルされたハッシュ結合の何が問題なのでしょうか?
まず最初に背景を説明します。
によるとスパーク-11675シャッフルハッシュ結合はSpark 1.6で削除されましたが、その理由は
...今のところは、大規模な結合についてはソートマージ結合を標準化し、将来必要になった場合はハッシュ結合のより優れた実装を作成する必要があると思います。
そしてSpark 2.0で再導入されたスパーク-13977なぜなら
ShuffledHashJoin は次のような場合にも役立ちます:
1) ビルド側のどのパーティションもメモリに収まる
2) ビルド側はストリーム側よりもはるかに小さいため、小さい側でハッシュ テーブルを構築する方が、大きい側でソートするよりも高速になります。
言及する価値があるのは広報SPARK-13977では、シャッフルハッシュ結合が削除され、ソートマージ結合が採用されたことが示されています。もっと早くそしてより堅牢。
どれくらい速いのかは分かりませんソート マージ 結合に比べシャッフルハッシュ結合ただし、ディスクに書き込まれる可能性があるソートマージ結合とは対照的に、シャッフル ハッシュ結合ではハッシュ テーブルがメモリに収まる必要があるため、これは明らかにより堅牢です。