我瀏覽了幾篇文章,但最終無法完全弄清楚它們之間的確切區別是什么。他們都以交叉產品的方式掃描每個記錄的表。他們說在 BroadcastNestedLoop 中,較小的表被廣播到所有作業節點。在笛卡爾連接的情況下,這種洗牌是如何發生的?您能否解釋一下 Spark 中的兩種加入策略之間究竟有什么不同。
uj5u.com熱心網友回復:
嵌套回圈連接
嵌套回圈連接是 SQL 中最基本的連接演算法(不僅在 Spark 中)。在偽代碼中可以描述為:
O_SET # outer query set
I_SET # inner query set
PREDICATE # join predicate
foreach o_row in O_SET:
foreach i_row in I_SET:
if i_row matches PREDICATE:
return (o_row, i_row)
廣播嵌套回圈連接
在廣播嵌套回圈連接中,輸入資料集之一被廣播給所有執行器。此后,非廣播輸入資料集的每個磁區都使用標準嵌套回圈連接程序連接到廣播資料集,以生成輸出連接資料。
因此,廣播嵌套回圈連接不會像笛卡爾連接那樣產生“全對全”連接。
笛卡爾連接
笛卡爾聯接專門用于在兩個輸入資料集之間執行交叉聯接。由于交叉連接是兩個資料幀的“全對全”記錄的連接,因此資料集的整個磁區被發送或復制到所有磁區。
輸出磁區的數量總是等于輸入資料集的磁區數量的乘積。對于輸出資料集中的每個輸出磁區,通過對映射到輸出磁區的兩個輸入磁區的資料進行笛卡爾積來計算資料。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/428253.html
上一篇:Spark中的SortMergeJoin中的鍵何時不可排序?
下一篇:條件連接(Oracle)
