範圍連接優化<一個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加入points2p2在p1.p> =p2.p-10和p1.p< =p2.p+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加入r2在r1.開始<r2.結束和r2.開始<r1.結束;——固定長度間隔重疊選擇*從r1加入r2在r1.開始<r2.開始+One hundred.和r2.開始<r1.開始+One hundred.;——一個範圍條件和其他連接條件選擇*從r1加入r2在r1.象征=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_key=b.id)加入c在(一個.ts之間的c.start_time和c.end_time)
請注意
在第三個例子中,你必須把提示放在c
.這是因為連接是左關聯的,因此查詢被解釋為(一個加入b)加入c
的提示一個
的連接一個
與b
而不是join withc
.
#創建分鍾表分鍾=(火花.sparkContext.並行化(((0,60),(60,120))).toDF(StructType([StructField(“minute_start”,IntegerType()),StructField(“minute_end”,IntegerType())))))#創建事件表事件=(火花.sparkContext.並行化(((12,33),(0,120),(33,72),(65,178))).toDF(StructType([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”)瓦爾joined2=df1.加入(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大小指定為配置參數。
集火花.磚.優化器.rangeJoin.binSize=5
此配置參數應用於具有範圍條件的任何連接。但是,通過範圍連接提示設置的不同的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(投(結束-開始作為雙),數組(0.5,0.9,0.99,0.999,0.9999))從範圍
建議的容器大小設置是第90百分位值的最大值,或第99百分位值除以10,或99.9百分位值除以100,依此類推。理由是:
如果第90個百分位數的值是倉位大小,則隻有10%的值間隔長度大於倉位間隔,因此需要跨越超過2個相鄰的倉位間隔。
如果第99百分位的值是二進製大小,則隻有1%的值間隔長度跨越超過11個相鄰的二進製間隔。
如果99.9百分位的值是倉位大小,則隻有0.1%的值間隔長度跨越101個相鄰的倉位間隔。
如果需要,可以對99.99、99.999百分位的值重複相同的操作。
所述方法限製重疊多個倉間隔的傾斜長值間隔的數量。以這種方式獲得的料倉大小值隻是微調的起點;實際結果可能取決於具體的工作負載。