連接優化範圍<一個class="headerlink" href="//m.eheci.com/docs/spark/latest/spark-sql/#range-join-optimization" title="">
一個範圍內加入發生在兩個關係加入使用點間隔或間隔重疊情況。範圍在磚連接優化支持運行時可以把數量級的提高查詢性能,但需要仔細的手工調優。
點在區間範圍內加入<一個class="headerlink" href="//m.eheci.com/docs/spark/latest/spark-sql/#point-in-interval-range-join" title="">
一個點在區間範圍內加入是一個加入的條件包含謂詞指定一個值從一個關係從其他兩個值之間的關係。例如:
——使用之間的表達式選擇*從點加入範圍在點。p之間的範圍。開始和範圍。結束;——使用不平等表達式選擇*從點加入範圍在點。p> =範圍。開始和點。p<範圍。結束;——固定長度區間選擇*從點加入範圍在點。p> =範圍。開始和點。p<範圍。開始+One hundred.;——加入兩套點值在一個固定的距離選擇*從裏p1加入points2p2在p1。p> =p2。p- - - - - -10和p1。p< =p2。p+10;——一係列條件與其他加入的條件選擇*從點,範圍在哪裏點。象征=範圍。象征和點。p> =範圍。開始和點。p<範圍。結束;
區間重疊範圍內加入<一個class="headerlink" href="//m.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="//m.eheci.com/docs/spark/latest/spark-sql/#range-join-optimization" title="">
範圍執行連接優化的連接:
有一個條件,可以解釋為一個點在間隔或間隔重疊範圍內加入。
所有值參與聯接條件範圍的數值類型(積分,浮點小數),
日期
,或時間戳
。所有值參與聯接條件是相同類型的範圍。在十進製類型,相同的價值觀也需要規模和精度。
這是一個
內心的加入
,或者在區間範圍內加入點,左外加入
左邊點值,或正確的外加入
右邊點值。本尺寸調優參數。
本大小<一個class="headerlink" href="//m.eheci.com/docs/spark/latest/spark-sql/#bin-size" title="">
的本大小是一個數字調優參數,分裂成多個域的值範圍條件垃圾箱相同的大小。例如,本大小為10,優化將域分為間隔長度10箱。如果你有一個範圍的條件p之間的開始和結束
,開始
是8,結束
是22,這個值區間重疊有三個箱子的長度第一本從0到10 - 10,從10到20第二本,第三本20到30。隻點落在相同的三個箱子需要考慮盡可能加入匹配區間。例如,如果p
是32,它可以排除之間下降開始
8、結束
22日,因為它屬於本從30到40。
請注意
為
日期
本大小的值,這個值被解釋為天。例如,一個本大小7代表一個星期的價值。為
時間戳
本大小的值,這個值是解釋為秒。如果需要不到一秒的值,可以使用分數值。例如,60本大小值代表一分鍾,和一本大小值為0.1時表示100毫秒。
您可以指定容器的大小通過使用一係列查詢中加入提示或通過設置一個會話配置參數。連接優化應用範圍隻有在你手動指定容器的大小。部分<一個class="reference internal" href="//m.eheci.com/docs/spark/latest/spark-sql/#id2">選擇容器的大小描述了如何選擇一個最佳本大小。
使範圍連接使用一係列連接提示<一個class="headerlink" href="//m.eheci.com/docs/spark/latest/spark-sql/#enable-range-join-using-a-range-join-hint" title="">
範圍,使連接優化SQL查詢,您可以使用一個範圍內加入提示指定容器的大小。提示必須包含的關係名稱的加入和數字本尺寸參數的關係。名字的關係可以是一個表,視圖,或子查詢。
選擇/ * + RANGE_JOIN(分,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
而不是加入c
。
#創建分鍾表分鍾=(火花。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())))))# Range_Join表的“提示”(事件。提示(“range_join”,60)。加入(分鍾,在=(事件。event_start<分鍾。minute_end,分鍾。minute_start<事件。event_end])。orderBy(事件。event_start,事件。event_end,分鍾。minute_start)。顯示())# Range_Join“暗示”連接表(事件。加入(分鍾。提示(“range_join”,60),在=(事件。event_start<分鍾。minute_end,分鍾。minute_start<事件。event_end])。orderBy(事件。event_start,事件。event_end,分鍾。minute_start)。顯示())
你也可以把一係列加入提示加入DataFrames之一。在這種情況下,提示隻包含數字本尺寸參數。
瓦爾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="//m.eheci.com/docs/spark/latest/spark-sql/#enable-range-join-using-session-configuration" title="">
如果您不想修改查詢,您可以指定容器的大小作為一個配置參數。
集火花。磚。優化器。rangeJoin。binSize=5
這個配置參數適用於任何加入一係列條件。然而,一組不同本大小通過一係列加入提示總是覆蓋一組參數。
選擇容器的大小<一個class="headerlink" href="//m.eheci.com/docs/spark/latest/spark-sql/#choose-the-bin-size" title="">
範圍連接優化的有效性取決於容器選擇合適的大小。
一個小容器大小導致更多的垃圾箱,這有助於篩選潛在的匹配。然而,它變得效率低下,如果本大小明顯小於遇到值間隔,和間隔重疊多個值本間隔。例如,使用一個條件p之間的開始和結束
,在那裏開始
是1000000,結束
是1999999,和一本大小為10,間隔與100000箱。
如果間隔的長度一致,知道,我們建議您將本大小設置為典型的預期值區間的長度。然而,如果間隔的長度不同和傾斜,必須找到一個平衡設定本規模有效地過濾很短的間隔,同時防止長間隔重疊太多的垃圾箱。假設一個表範圍
,列之間的時間間隔開始
和結束
傾斜的,可以確定不同的百分位數區間長度值以下查詢:
選擇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百分位,等等。
所描述的方法限製了傾斜長值區間重疊多個本間隔。本大小值獲得這種方式隻是一個起點微調;實際結果可能取決於特定的工作負載。