连接优化范围<一个class="headerlink" href="//www.neidfyre.com/docs/optimizations/#range-join-optimization" title="">

一个范围内加入发生在两个关系加入使用点间隔或间隔重叠情况。范围在砖连接优化支持运行时可以把数量级的提高查询性能,但需要仔细的手工调优。

点在区间范围内加入<一个class="headerlink" href="//www.neidfyre.com/docs/optimizations/#point-in-interval-range-join" title="">

一个点在区间范围内加入是一个加入的条件包含谓词指定一个值从一个关系从其他两个值之间的关系。例如:

——使用之间的表达式选择*加入范围p之间的范围开始范围结束;——使用不平等表达式选择*加入范围p> =范围开始p<范围结束;——固定长度区间选择*加入范围p> =范围开始p<范围开始+One hundred.;——加入两套点值在一个固定的距离选择*p1加入points2p2p1p> =p2p- - - - - -10p1p< =p2p+10;——一系列条件与其他加入的条件选择*,范围在哪里象征=范围象征p> =范围开始p<范围结束;

区间重叠范围内加入<一个class="headerlink" href="//www.neidfyre.com/docs/optimizations/#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.neidfyre.com/docs/optimizations/#range-join-optimization" title="">

范围执行连接优化的连接:

  • 有一个条件,可以解释为一个点在间隔或间隔重叠范围内加入。

  • 所有值参与联接条件范围的数值类型(积分,浮点小数),日期,或时间戳

  • 所有值参与联接条件是相同类型的范围。在十进制类型,相同的价值观也需要规模和精度。

  • 这是一个内心的加入,或者在区间范围内加入点,加入左边点值,或正确的加入右边点值。

  • 本尺寸调优参数。

本大小<一个class="headerlink" href="//www.neidfyre.com/docs/optimizations/#bin-size-1" 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/optimizations/#id2">选择容器的大小描述了如何选择一个最佳本大小。

使范围连接使用一系列连接提示<一个class="headerlink" href="//www.neidfyre.com/docs/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=bid)加入c(一个ts之间的cstart_timecend_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/optimizations/#enable-range-join-using-session-configuration" title="">

如果您不想修改查询,您可以指定容器的大小作为一个配置参数。

火花优化器rangeJoinbinSize=5

这个配置参数适用于任何加入一系列条件。然而,一组不同本大小通过一系列加入提示总是覆盖一组参数。

选择容器的大小<一个class="headerlink" href="//www.neidfyre.com/docs/optimizations/#choose-the-bin-size" title="">

范围连接优化的有效性取决于容器选择合适的大小。

一个小容器大小导致更多的垃圾箱,这有助于筛选潜在的匹配。然而,它变得效率低下,如果本大小明显小于遇到值间隔,和间隔重叠多个值间隔。例如,使用一个条件p之间的开始结束,在那里开始是1000000,结束是1999999,和一本大小为10,间隔与100000箱。

如果间隔的长度一致,知道,我们建议您将本大小设置为典型的预期值区间的长度。然而,如果间隔的长度不同和倾斜,必须找到一个平衡设定本规模有效地过滤很短的间隔,同时防止长间隔重叠太多的垃圾箱。假设一个表范围,列之间的时间间隔开始结束倾斜的,可以确定不同的百分位数区间长度值以下查询:

选择APPROX_PERCENTILE((结束- - - - - -开始作为),数组(05,09,099年,0999年,09999年))范围

本大小的推荐设置将在第90个百分位的最大价值,或在第99个百分位值除以10,或者在第99.9个百分位值除以100等等。基本原理是:

  • 如果该值在第90个百分位是箱子的尺寸,只有10%的区间长度超过本间隔的值,所以跨度超过2邻本间隔。

  • 如果该值在第99个百分位是箱子的尺寸,只有1%的价值区间长度跨度超过11邻本间隔。

  • 如果该值在第99.9个百分位是箱子的尺寸,只有0.1%的价值区间长度跨度超过101邻本间隔。

  • 相同的可以重复的值在第99.99,第99.999百分位,等等。

所描述的方法限制了倾斜长值区间重叠多个本间隔。本大小值获得这种方式只是一个起点微调;实际结果可能取决于特定的工作负载。