00:00
啊,那大家其实会发现这个window draw其实还是比较有限制的,就是你直接这么连接的话,后面就必须得开窗,那假如我们当前的这个需求不是开窗的需求呢。啊,那大家就想到那这个window draw好像就没用了呀啊,所以接下来再给大家介绍另外一种照用方式,就是所谓的interval draw区间连接或者叫间隔连接,它指的这个连接方式是什么呢?大家直接看图吧。这个连接方式。诶,大家首先看一下当前这个连接,这应该是谁状语谁呢。看他撞移的这个结果啊,哎,这橙色的这个发出了,好像发出了一个一个光芒啊,收了一段的这个区间,收了一个区域一样,然后撞影出来的结果是2021,是不是还是城流这个数据在前面啊,所以大家自然想到了这还是城流去撞影绿流对吧?那这个撞影的规则又是什么呢?它是我们当前要定义一个时间间隔时间的区间,大家看这里边就它发出来这里有一个下界对吧?Lower bond下界,然后上面呢,有一个upper bond,一个上界,定义了这个上下界之后,大家其实就知道了,是不是基于当前城流数据,这个数据以它为准,相当于前后就可以划定一个区间范围啊,所以它连接绿流里边数据的时候,怎么配对呢?就是针对以城流为主,针对城流里边的每一个数据,把它的时间戳周围扩充一个时间区间,然后在这个区间范围内的预留数据都跟他一一配对,配对起来做一个连接操作。
01:44
那接下来我们处理的就是这样的一对儿一对数据了,对吧?哎,所以这个就叫做区间连接,或者叫间隔连接,因为它定义了这样一个连接的间隔。啊,那具体来讲,它的就是什么样的数据可以连接在一起呢?大家看这里面有一个公式。
02:01
就是我先定义这个下界lower boundund和upper bound,如果说A去join应B的话,就城流去照应绿流对吧?啊,那么A去照应B的话,B的时间戳怎么样?符合这样什么样的规则就可以跟A连接在一起呢?就是它的时间戳在A的时间戳加下界到A的时间戳加上界之间,诶这个是区间的表达,那大家如果写成这个,呃,这个不等式的话,那其实就是B的时间戳大于等于A时间戳加下界,小于等于A时间戳加上界对吧。大家注意这里面都是有有等于的对吧,都是包含的啊,所以大家看一下,现在大家能看出来当前我的下界和上界是多少吗?当前的下界,这是不是在当前这个是他的那个毫秒数对吧?二啊,在它的基础上是不是直接,诶朝前是不是可以可以两毫秒啊,朝前两毫秒,那这个下界就应该是。
03:05
大家注意这是加对吧,所以当前是不是应该是负二毫秒啊啊,然后这个上界就应该是。上界注意这是二,再往这边扩的话,它最多到多少,是不是只能到三,这是加了一啊,所以它是不是应该上界是一正一毫秒啊,所以我们当前区间连接间隔连接这个区间是不是就是负二到正一啊,就是这样的一个区间。啊,所以大家接下来看一看这个代码怎么写啊,这个代码也比较有意思,呃,大家可能会想到前面我们在这个源码里边去看这个data stream的时候,好像是不是只有这么一个状语方法呀。只有一个对不对,然后这个状语方法后面我们去点点点点进去之后join the streams,就只能是,然后接下来where equal to,然后开窗window apply,对吧,就只能是这样去做呀,没有区间连接啊,那那这个区间连接是怎么做的呢?
04:01
诶,大家要注意data stream不能直接做区间连接,做区间连接必须得怎么样呢?先KBY,先得到k stream,然后大家看这个K里边,它没有直接的那个draw方法,但是有一个方法叫做interval join,对吧?这就是我们的区间连接的那个方法,它直接就叫做interval join。所以本来就应该是一个k stream去调这个方法,然后它里边连接的那个那个stream呢,大家看是不是也必须是一个k stream呀,所以它必须是KPI之后的这个流啊,才能够做区间连接啊啊,那当然后面大家看到它的这个连接起来之后的数据类型是不是就叫做inter draw啊。然后这里边的类型它是不是TTT1多了一个K对吧,多了一个当前K的类型,然后接下来的调用方法其实也比较限定啊,In特状影大家看是k swim里边的一个内部类,它能调什么方法呢?
05:03
只能调一个between方法。Between方法,大家知道between啥意思,这是不是就是要指定我们当前的那个对区间间隔嘛,哎,所以大家看这不是lower bound和upper bound吗?指定这个时间间隔,然后就得到了一个interval drawing的这样的一个类型,这又是一个内部类,然后接下来它又能调什么呢?诶,大家看到这里边它能调,哎,这首先有两个这个方法啊,一个叫做lower bound exclusive,或者叫upper bound exclusive,这是什么意思?这是对,之前我们不是讲那个上下界是都大于等于小于等于吗?是不是都包含啊,如果说你要不包含的话,可以单独调一下这个方法,把它去掉,那大家自然想到了,这个方法应该是一个可选的方法,不一定非要调,对吧?所以你看它得到结果类型是不是还是interval join的呀,相当于一个配置项,那最终做计算,做连接计算的是个什么呢?
06:02
就是一个process方法对吧,所以process方法里边传的这个参数就是一个。Process drawing function,之前我们不是讲这个process function里边的这个家族吗?另外还有这个process drawing function,现在大家也见到了,对吧?是在这儿出现的,是在inter draw里边最终必须掉这样的一个方法实现这个这样的一个呃,抽象类啊,那里边的这个方法呢,它既然是process function里面的一员,它这个方法是不是也叫process element啊?只不过这里边它的输入是不是有两个了,大家看印一印二后边是不是也有上下文,然后有这个alt.click的去做输出啊,哎,所以这就是具体的一个操作流程啊呃,整体来讲也是限定死的,后面就这么去掉。那大家看一下这个具体的代码怎么写,具体代码这里边就是城流,首先做一个KBY,对吧?啊,先去做分组,然后去interval join一个绿流,接下来是不是必须要between between的话,大家看指定的这个范围,就是我们刚才分析的是不是负二毫秒到正一毫秒啊,负二到正一,然后接下来就是一个process process里边实现的是一个process drawing function里边的这个整个处理,其实大家看到它也没用到上下文里面的东西,对吧?直接就把这两个左左和右,这不就是第一条留第二条里的数据吗?连接起来,匹配的数据,逗号分割,直接作为一个string直接输出了,对吧,out.collect做一个输出。
07:32
当前它输出的类型是不是在这里已经指定了呀,Process draw function里面这里已经指定了。这就是区间连接的一个使用的过程,对吧?它的撞用方法不是开窗口去做这个笛卡耳机,而是针对某一条流,大家可以认为这是主流,对吧,主动去连接的一条流,针对这条主流去连接另外一条流的时候,它是开一个区间范围,时间的一个区间范围,然后在这个范围内的另外一条流的数据都跟当前这条数据匹配起来。
08:06
这就是区间连接的原理。
我来说两句