#Spark join的三種方式:
1.broadcast hash join:將其中一張較小的表通過廣播的方式晚伙,由driver發(fā)送到各個executor,大表正常被分成多個區(qū)拿愧,每個分區(qū)的數(shù)據(jù)和本地的廣播變量進(jìn)行join(相當(dāng)于每個executor上都有一份小表的數(shù)據(jù),并且這份數(shù)據(jù)是在內(nèi)存中的,過來的分區(qū)中的數(shù)據(jù)和這份數(shù)據(jù)進(jìn)行join)拾因。broadcast適用于表很小,可以直接被廣播的場景旷余;
2.shuffle?hash join:一旦小表比較大绢记,此時就不適合使用broadcast hash join了。這種情況下正卧,可以對兩張表分別進(jìn)行shuffle蠢熄,將相同key的數(shù)據(jù)分到一個分區(qū)中,然后分區(qū)和分區(qū)之間進(jìn)行join炉旷。相當(dāng)于將兩張表都分成了若干小份签孔,小份和小份之間進(jìn)行hash join,充分利用集群資源窘行。
上面介紹的方式只對于兩張表有一張是小表的情況適用饥追,而對于兩張大表,但當(dāng)兩個表都非常大時罐盔,顯然無論哪種都會對計(jì)算內(nèi)存造成很大的壓力但绕。這是因?yàn)閖oin時兩者采取都是hash join,是將一側(cè)的數(shù)據(jù)完全加載到內(nèi)存中翘骂,使用hash code取join key相等的記錄進(jìn)行連接壁熄。
3 .SparkSQL對兩張大表join采用了全新的算法-sort-merge join,整個過程分為三個步驟:
(1).shuffle階段:將兩張大表根據(jù)join key進(jìn)行重新分區(qū)碳竟,兩張表數(shù)據(jù)會分布到整個集群草丧,以便分布式并行處理
(2).sort階段:對單個分區(qū)節(jié)點(diǎn)的兩表數(shù)據(jù),分別進(jìn)行排序
(3).merge階段:對排好序的兩張分區(qū)表數(shù)據(jù)執(zhí)行join操作莹桅。join操作很簡單昌执,分別遍歷兩個有序序列,碰到相同join key就merge輸出诈泼,否則繼續(xù)取更小一邊的key懂拾。