00:00
发现了,就是对于这个window draw影而言,确实整体来讲是比较限制,要求比较高,而且它依赖于窗口的这些操作啊,尽管我们可以把之前的那个窗口操作都沿用下来啊,但是实际应用的时候它不够灵活,那实际应用的过程当中,更加广泛的应用状用方式是哪种呢?我们看后面另外一大类,就是所谓的interval draw间隔连接,那这个interval join用指的又是什么呢?顾名思义,它就是按照一定的时间间隔前后去撞,对应另外一条流里面的数据啊,这个光这么说的话有点有点奇怪对吧?那那给大家看一下这里边有一个这个公式啊,主要是怎么样去做join应呢?比方说大家看这个A,如果要跟B里边的数据去做join应的话,那我可以指定一个时间间隔,就是我可以指定一个下届lower bound,对吧,还指定一个上届upper bound,那么怎么样就可以把这个。
01:00
呃,按照这个时间间隔照用起来呢,如果B的时间戳它属于这个区间内,就是A的时间戳加上lower boundund到加上upper bound之间的话,呃,所以我们说它是一个时间间隔状语,对吧?如果在这个区间范围内的话,这个A和B这两条数据就可以状在一起,或者你写成另外一个更好理解的方式,就是B的time sum时间戳大于等于A加这个lower bound,或者是小于等,呃,而且小于等于这个加upper bound在它之间的话,它俩就可以装一起,这个看起来还是不太好理解是吧?那我们看这幅图吧,这幅图就非常的明显了,这幅图就是,诶,我们首先看一下这到底是谁撞晕谁呢?我们一看又会发现它是针对每一个城流里边的数据发出了一个时间间隔一个区间,然后要去啊把绿流里面的数据要收进来,去做去做照引,对吧?所以当然就是城流去join引绿流,所以这就相当于这个城流是A,率流是B对吧?所以我们判断的这个当前一个数啊,比方说这个乘流里边二,这是假如我们认为这就是它的时间戳,这个数据怎么样跟绿流里边的数据去连接去join呢?
02:20
诶,那就是我们说假如定义了一个这个,大家看一下现在这个上下线是多少呢?Lower bound和upper bound是是多少呢。就是假如在它发出来的这个范围内啊,这个区间范围内收进来的所有的绿流的数据就可以跟它连接在一起,所以大家看到连接起来就是什么呢?发出的这个范围它就是2021对吧,还是自己在前面,然后这个连接的那条流数据在后边,然后你看三这里边呢,发出的这个还是同样的一个范围,对吧?同样的一个建国就只有一了,那就是314,这里边就没连接到东西,所以它就没有匹配啊,那对应的这个五,这里边呢,前面没有,但是后边有一个六,所以它匹配起来就是五六,大家想一下现在的这个下限和上限到底是多少。
03:10
因为我们之前说都必须是加对吧?诶,所以这里边的下界应该是一个负二对吧?如果我们认为这是毫秒的话,这就是一个负二毫秒,然后如果这里边是一个上界,大家看到比它要大对吧?所以如果这里边我们绿流里面的数据后面是二和三也可以被它连接起来,那所以是不是还可以正一啊,到这个upper棒的是不是就应该是一个正一,哎,所以大家看到下边的这个代码里边的实现啊,我们当前的这个定义怎么去定义呢?哎,就是首先乘流去状引绿流对吧?乘流大家注意看,要先去做一个KBY,先指定当前的K分组,然后怎么样呢?呃,接下来就是interval join,有一个API就叫做interval join join,另外一条流green,这个绿流,注意绿流也要先做一个K麦对吧?啊,就是一头都是要先同时指定我们当前的K到底是什么。
04:10
同样的T后面我们才有有这个撞在一起的理由,对吧,要不然的话你这个就没有意义了吧,然后接下来呢,要指定间隔,怎么指定间间隔呢,点between就调这个方法。掉了这个between之后,里边大家看到这传的是什么,又是大家熟悉的这个time的这个定义对吧?下界这里边传的是一个负二毫秒,上界是一个正一毫秒,这就是我们上面这个啊,做的这个实现对吧?然后后面做什么操作呢?直接点process,然后里边传的是一个process draw function,好,就这里边得得传这这样一个东西啊,然后里边实现的过程当中,你会看到它里边是什么,既然又是一个process方式么?它会有这个上下文对吧?这个稍微复杂一点,如果我们不管它的话,那大家看是不是就是一个left,一个right,这是不是就是还是当前的乘流里边的数对吧?和绿流里边的数,哎,把它获取到,然后你想做什么转换,结合这个上下文里边的数据啊,那计算之后最后输出就完事了,用这个alt.collect做一个输出,我们这里边又是直接逗号分割,直接把它拼在一起了,所以大家看。
05:25
那这里面的输出就直接又是二逗号零,二逗号一,这就是interval状语的一个过程。啊,所以这个internal照应整体来讲,它的灵活程度就会更高,而且它它的特点是什么呢?它是针对数据的,大家看啊,这个时间是针对数据来讲的,对吧?它并不像我们前面这样局限于窗口的定义,就是你到底是滚动到底是滑动啊,就是这个起始位置结束位置就都已经确定了,呃,那那如果说我们的那个数据,它来的时间点刚好错开那个一个窗口的那里边统计的那个周期的话,那就相当于这个结果就得不到正确的了,所以用t draw就可以避免这样的一种情形啊,所以这种场景可能在具体应用的过程当中会更加常见一点啊,然后我们在源码里边给大家也稍微的看一下,关于这个源码里边,大家首先看这个data stream里边首先我们会发现你如果输这个internal drawing的话是没有的,对吧,因为前面我们输draw语的时候,大家知道就只有一个draw语嘛,没有别的东西,哎,那这个internalval draw语到底在哪里呢?是在K的。
06:33
Stream的API里边就它只属于k stream能够调用的一个方法,这也是为什么我们前面必须要先KY对吧?这里面必须要先KY之后才能调这个方法,然后大家会看到这里边有一个interval drawing对吧?Interval drawing,然后得到的数据类型是什么呢?哎,这里边就又来了,后边它的定义,所有的调用方式也都是定死了的啊,就是大家看到它得到的是什么,就是他要撞用另外一个k stream啊,也是一个k stream对吧?大家看这是两个K之间的事啊,跟data stream就已经没关系了。呃,然后这里边inter得到的是一个interval draw语类型,就叫这个类型。
07:12
那然后这个inter drawing又能干什么事呢?接下来能调的方法就只有一个between啊,啊,然后这个得到这个between得到的是一个internal join的啊有有这样一个类型啊,这个between大家知道他传的这个就一个上下界对吧,大家看就是一个lower bond和一个upper bond,然后这里边它可能还能够大家看到下面这个得到这个inter状里边啊,这里边还能调一些方法,比方说什么呢?我能调一个lower bound,呃,Exclusive。大家知道exclusive是什么意思,不包含对吧?诶,所以这里边大家可能会有怀疑,就是说之前我们在做这个状语的过程当中,这里边123对吧?这这这个边界上的这个零和三分别包含不包含呢?这张图大家看的很明显,零包含对吧?后边的最后一个六是不是也包含啊,所以默认我们这个呃状的里面大家看到有两个属性啊,叫做lower bond是否包含对吧?还有一个upper bound是否包含啊,这里边都一开始都是true啊,那你如果要是调了这个方法,要去掉它的这个包含的话,就把它指成false了对吧?啊,这个非常好理解啊,那除了这些就是可选的这个方法之外,大家看真正能调的处理方法就有一个process对吧?啊,所以这里边它的这个调用过程也是定死了的,没有别的方法,就只有这么一步一步调,这里边的process里边传的就是一个process drawing function,然后。
08:46
这里边具体你需要重写的一个方法,大家看到就叫做process element对吧?啊,因为process function嘛,里边不就是每来一条数据都要调一个process element吗?那现在的每一条数据是什么呢?其实是就是我们已经匹配好的一对数据,两条流里边的各自的一对数据,对吧?所以大家看到这里边有left有right,这是第一条流里的数据,这是第二条流里的数据,你做一个转换,然后输出就完事了,如果你想用到呃,上下文里边的一些信息的话,你用它对吧?然后另外还有就是我们这里边的输出用了一个collect al.collect可以输出多条,所以整体来讲,这里边这个drawing process draw function啊,在这个drawing这个实现的过程当中,是不是比那个window drawing,那个apply能调的那个join function能做的事情就更多啊啊,它的灵活度就会更高一点,使用也会更加的场景会更多一些啊,这就是关于这个internal draw的一个介绍。
我来说两句