连接优化范围<一个class="headerlink" href="//www.neidfyre.com/docs.gcp/optimizations/#range-join-optimization" title="">
一个范围内加入发生在两个关系加入使用点间隔或间隔重叠情况。范围在砖连接优化支持运行时可以把数量级的提高查询性能,但需要仔细的手工调优。
点在区间范围内加入<一个class="headerlink" href="//www.neidfyre.com/docs.gcp/optimizations/#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="//www.neidfyre.com/docs.gcp/optimizations/#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.neidfyre.com/docs.gcp/optimizations/#range-join-optimization" title="">
范围执行连接优化的连接:
有一个条件,可以解释为一个点在间隔或间隔重叠范围内加入。
所有值参与联接条件范围的数值类型(积分,浮点小数),
日期
,或时间戳
。所有值参与联接条件是相同类型的范围。在十进制类型,相同的价值观也需要规模和精度。
这是一个
内心的加入
,或者在区间范围内加入点,左外加入
左边点值,或正确的外加入
右边点值。本尺寸调优参数。
本大小<一个class="headerlink" href="//www.neidfyre.com/docs.gcp/optimizations/#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="//www.neidfyre.com/docs.gcp/optimizations/#id2">选择容器的大小描述了如何选择一个最佳本大小。
使范围连接使用一系列连接提示<一个class="headerlink" href="//www.neidfyre.com/docs.gcp/optimizations/#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="//www.neidfyre.com/docs.gcp/optimizations/#enable-range-join-using-session-configuration" title="">
如果您不想修改查询,您可以指定容器的大小作为一个配置参数。
集火花。砖。优化器。rangeJoin。binSize=5
这个配置参数适用于任何加入一系列条件。然而,一组不同本大小通过一系列加入提示总是覆盖一组参数。
选择容器的大小<一个class="headerlink" href="//www.neidfyre.com/docs.gcp/optimizations/#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百分位,等等。
所描述的方法限制了倾斜长值区间重叠多个本间隔。本大小值获得这种方式只是一个起点微调;实际结果可能取决于特定的工作负载。