範圍連接優化<一個class="headerlink" href="//www.eheci.com/docs/spark/latest/spark-sql/#range-join-optimization" title="">

一個範圍內加入當使用區間內的點或區間重疊條件連接兩個關係時發生。Databricks Runtime中的範圍連接優化支持可以帶來數量級的查詢性能改進,但需要仔細的手動調優。

點在區間範圍內聯接<一個class="headerlink" href="//www.eheci.com/docs/spark/latest/spark-sql/#point-in-interval-range-join" title="">

一個點在區間範圍內聯接是一個連接,其中條件包含謂詞,指定來自一個關係的值位於來自另一個關係的兩個值之間。例如:

——使用BETWEEN表達式選擇加入範圍p之間的範圍開始而且範圍結束——使用不等式表達式選擇加入範圍p> =範圍開始p<範圍結束——間隔固定長度選擇加入範圍p> =範圍開始p<範圍開始+One hundred.——在固定距離內連接兩組點值選擇p1加入points2p2p1p> =p2p-10p1p< =p2p+10——一個範圍條件和其他連接條件選擇範圍在哪裏象征範圍象征p> =範圍開始p<範圍結束

區間重疊範圍連接<一個class="headerlink" href="//www.eheci.com/docs/spark/latest/spark-sql/#interval-overlap-range-join" title="">

一個區間重疊範圍連接是一個連接,其中條件包含謂詞,指定每個關係的兩個值之間的間隔重疊。例如:

——重疊[r1.]首先,r1。結束] with [r2.start, r2.end]選擇r1加入r2r1開始<r2結束r2開始<r1結束——固定長度間隔重疊選擇r1加入r2r1開始<r2開始+One hundred.r2開始<r1開始+One hundred.——一個範圍條件和其他連接條件選擇r1加入r2r1象征r2象征r1開始< =r2結束r1結束> =r2開始

範圍連接優化<一個class="headerlink" href="//www.eheci.com/docs/spark/latest/spark-sql/#range-join-optimization" title="">

對於以下連接執行範圍連接優化:

  • 有條件可以解釋為點在區間或區間重疊範圍內聯接。

  • 範圍連接條件中涉及的所有值都是數值類型(整數、浮點數、小數點),日期,或時間戳

  • 範圍連接條件中涉及的所有值都是相同類型的。對於十進製類型,這些值還需要具有相同的刻度和精度。

  • 這是一個內心的加入,如果點在區間範圍內連接,則為a加入左邊有點值,或者正確的加入右邊是點值。

  • 有一個bin大小調優參數。

本大小<一個class="headerlink" href="//www.eheci.com/docs/spark/latest/spark-sql/#bin-size-1" title="">

本大小是將範圍條件的值域分割為多個的數值調優參數嗎垃圾箱大小相等的例如,對於大小為10的容器,優化將域劃分為間隔長度為10的容器。如果你有一個點在p之間的開始結束,開始是8和結束是22,這個值區間與三個長度為10的容器重疊——第一個容器從0到10,第二個容器從10到20,第三個容器從20到30。隻有落在相同三個箱子中的點才需要考慮作為該間隔的可能連接匹配。例如,如果p是不是32歲之間,就可以排除掉了開始8和結束22的,因為它落在30到40的箱子裏。

請注意

  • 日期值時,bin大小的值被解釋為天數。例如,bin大小值為7表示一周。

  • 時間戳值時,bin大小的值被解釋為秒。如果需要次秒級的值,則可以使用小數值。例如,bin大小值為60表示一分鍾,bin大小值為0.1表示100毫秒。

您可以通過在查詢中使用範圍連接提示或通過設置會話配置參數來指定bin大小。應用範圍連接優化隻有在您可以手動指定存儲空間大小。部分<一個class="reference internal" href="//www.eheci.com/docs/spark/latest/spark-sql/#id2">選擇箱子大小描述如何選擇最佳存儲區大小。

使用範圍連接提示啟用範圍連接<一個class="headerlink" href="//www.eheci.com/docs/spark/latest/spark-sql/#enable-range-join-using-a-range-join-hint" title="">

要在SQL查詢中啟用範圍連接優化,可以使用範圍連接提示指定存儲區大小。提示必須包含連接關係之一的關係名和數值bin大小參數。關係名可以是表、視圖或子查詢。

選擇/*+ RANGE_JOIN(points, 10) */加入範圍p> =範圍開始p<範圍結束選擇/*+ RANGE_JOIN(r1, 0.1) */選擇範圍在哪裏範圍<One hundred.r1範圍r2在哪裏r1開始<r2開始+One hundred.r2開始<r1開始+One hundred.選擇/*+ RANGE_JOIN(c, 500) */一個加入b一個b_keybid加入c一個ts之間的cstart_timecend_time

請注意

在第三個例子中,你必須把提示放在c.這是因為連接是左關聯的,因此查詢被解釋為(一個加入b)加入c的提示一個的連接一個b而不是join withc

#創建分鍾表分鍾火花sparkContext並行化(((060),60120)))toDFStructType([StructField“minute_start”IntegerType()),StructField“minute_end”IntegerType()))))#創建事件表事件火花sparkContext並行化(((1233),0120),3372),65178)))toDFStructType([StructField“event_start”IntegerType()),StructField“event_end”IntegerType()))))在from表上添加"hint事件提示“range_join”60加入分鍾事件event_start<分鍾minute_end分鍾minute_start<事件event_end])orderBy事件event_start事件event_end分鍾minute_start顯示()在連接表上添加"hint事件加入分鍾提示“range_join”60),事件event_start<分鍾minute_end分鍾minute_start<事件event_end])orderBy事件event_start事件event_end分鍾minute_start顯示()

您還可以在其中一個已連接的數據框架上放置一個範圍連接提示。在這種情況下,提示隻包含數值bin大小參數。

瓦爾df1火花表格“範圍”).作為“左”瓦爾df2火花表格“範圍”).作為“正確”瓦爾加入df1提示“range_join”10加入df2“left.type”= = =“right.type”& &“left.end”>“right.start”& &“left.start”<“right.end”瓦爾joined2df1加入df2提示“range_join”0.5),“left.type”= = =“right.type”& &“left.end”>“right.start”& &“left.start”<“right.end”

使用會話配置啟用範圍連接<一個class="headerlink" href="//www.eheci.com/docs/spark/latest/spark-sql/#enable-range-join-using-session-configuration" title="">

如果不想修改查詢,可以將bin大小指定為配置參數。

火花優化器rangeJoinbinSize5

此配置參數應用於具有範圍條件的任何連接。但是,通過範圍連接提示設置的不同的bin大小總是覆蓋通過參數設置的bin大小。

選擇箱子大小<一個class="headerlink" href="//www.eheci.com/docs/spark/latest/spark-sql/#choose-the-bin-size" title="">

範圍連接優化的有效性取決於選擇合適的bin大小。

較小的容器大小導致較大數量的容器,這有助於過濾潛在的匹配。但是,如果bin大小明顯小於遇到的值間隔,且值間隔重疊倍數,則效率就會降低箱子間隔。例如,帶有條件p之間的開始結束,在那裏開始是1,000,000和結束為1,999,999,bin大小為10,值區間與100,000個bin重疊。

如果間隔的長度相當一致且已知,我們建議將bin大小設置為值間隔的典型預期長度。但是,如果間隔的長度是變化的並且是傾斜的,那麼必須找到一個平衡點來設置一個有效過濾短間隔的容器大小,同時防止長間隔重疊太多的容器。假設有一張表範圍,列與列之間的間隔開始而且結束,您可以使用以下查詢確定傾斜間隔長度值的不同百分位數:

選擇APPROX_PERCENTILE結束-開始作為),數組0509099099909999))範圍

建議的容器大小設置是第90百分位值的最大值,或第99百分位值除以10,或99.9百分位值除以100,依此類推。理由是:

  • 如果第90個百分位數的值是倉位大小,則隻有10%的值間隔長度大於倉位間隔,因此需要跨越超過2個相鄰的倉位間隔。

  • 如果第99百分位的值是二進製大小,則隻有1%的值間隔長度跨越超過11個相鄰的二進製間隔。

  • 如果99.9百分位的值是倉位大小,則隻有0.1%的值間隔長度跨越101個相鄰的倉位間隔。

  • 如果需要,可以對99.99、99.999百分位的值重複相同的操作。

所述方法限製重疊多個倉間隔的傾斜長值間隔的數量。以這種方式獲得的料倉大小值隻是微調的起點;實際結果可能取決於具體的工作負載。