00:00
我们现在已经了解了,基于时间的河流操作,在link当中主要就是窗口连接window draw和间隔连接internal draw,这两种draw用方式呢,我们可以认为它是在底层的通用的connect连接的基础上啊,做了一个特殊化的规定,做了一些限制,针对某些特定的场景使用就会非常的方便,那最后呢,我们再来介绍另外一个比较特殊的。基于时间的合流操作,哎,那就是所谓的window Co group,我们可以把它翻译成窗口同组连接,那它的用法呢,直观上来看就是跟window draw基本上是完全一样的啊,只不过呢,就是我们在调用的过程当中,把之前的draw方法换成data stream的Co group方法就可以了,我们看到这个调用的过程啊,所有API的使用基本上是一致,后边接下来就是点where去指定第一条流里的K,然后点E扣two指定第二条流里的key,接下来呢,点window去开窗,最后来一个点apply。
01:05
点里边现在传的就不是drawing function了啊,之前我们是传draw function或者flat drawing function,哎,那现在要传入的呢,就是一个Co group function。接下来我们也可以在源码当中去看一看这个调用到底是怎么回事啊,我们可以就直接对比之前的这个window join啊,在这里我们就调用data stream的。Co group方法,我们看有一个方法就是这样传入另外一个data stream作为参数,得到的是一个叫做Co group streams这样一个数据流类型啊,那接下来呢啊,我们点进去就会看到它能够调用的方法,同样只有一个点where,那得到的类型呢,是一个where数据类型,哎,那同样这也是一个内部的类型了啊那。这个VR类型呢,只能调用一个方法,就叫做equal to,哎,那得到的类型是一个e to,接下来equal to又只能调用一个window方法,得到一个with window这样的类型啊,那with window,哎,那接下来我们就知道了,它是可以去调用窗口其他API的啊,可以有trigger aviloud lateness,那最后最关键的啊,类似于窗口函数的一个调用,那就是点apply apply这里边我们看可以传入拉姆达表达式,那更加一般化的方式,当然就是传一个Co group方式。
02:34
Co group function当然又是一个interface,一个接口,它也是单一抽象方法接口里边必须要实现的抽象方法就是Co group Co group这里呢,我们看到它也没有返回值类型,哎,那所以它跟之前我们看到的flat draw function是非常像的,诶,那这里呢,也是有两条流里的数据元素可以作为参数拿到,另外还有一个or collector,这就是我们输出数据的方式。
03:03
调用collect的collect的方法,诶,那就可以想输出就输出,想输出几次就输出几次,那这里的区别就在于之前我们看到啊,这里我们还是看一下之前的draw用。Join streams里边,哎,我们可以一层一层点进去,Equal to with window里边调用apply方法,哎,那我们看到这里,如果我们这里是一个flat draw function的话,那么里边它实现的这个状语方法的参数也是三个。区别就在于前面我们捕获到的数据元素,哎,它本身状语,这里呢,就是我们说的第一条流里的一个元素,第二条流里的一个元素,它们如果K相同,又在同一个窗口内的话,接下来那就是一个笛卡耳机,两两配对,有一对就会调用这里的装修方法一次,那现在的Co group呢,这个就完全不一样了,它是一个interable类型。
04:04
哎,那所以这是一个集合,那那为什么变成集合了呢?说明它不再是一个一个元素拿出来去做笛卡尔基配对了,而是直接把当前窗口内当前K的所有元素都作为一个集合类型,作为第一个参数,直接调用这里的扣方法。所以我们看到当前的Co group方法只会被调用一次,就相当于我们这里是一个批处理一样,所有的数据都拿到啊,那么第一条流里的在Y1这个集合类型里,那第二条流里的数据呢,就都在Y2这个集合类型的数据啊,那所以它的区别就在这里啊,那有了这个特点我们就会看到,呃,那之前我们做这个window状语的时候,那只能检测到匹配的数据,那现在呢,现在就相当于假如说我们只出现在一条流里,另外一条流里没有对应匹配的数据,哎,那这个也没关系,我们也可以把它单独拿出来啊,那所以这就不光能实现类似于inner drawing的功能,还能实现al drawing外连接啊,左外连接、右外连接、全外连接都可以实现。
05:14
那所以它相当于是一个更加一般化、底层化的window状语的实现。那所以我们可以认为Co group其实是一个更加通用化版本的window join啊,其实如果我们感兴趣追到源码里的话,会发现window draw的底层实现其实就是Co group。那我们在这里可以简单的做一个测试。还是新建一个SC的object?当前我们测试的是Co group test。没方法,哎,那这个调用呢,其实我们会发现看window几乎一样嘛,所以我们干脆就把这个过程完整的copy过来。然后做一些改动,哎,那首先我们先把上面下划线先引入,后面要做影视转换,然后呢,呃,数据还是这些数据啊,接下来我们要做的操作,那就不是窗口连接了,是窗口同组连接,那所以这里调用的方法就不是join,而是。
06:15
Co group,哎,那后边这里的apply,我们要实现的当然就不是draw function了,而是一个。Co group方式。那这里的类型其实也是完全一样的啊,哎,那首先。数据string,长整形long。第二条流里的数据类型也是一样。二元组string了,最后输出的数据类型,我们直接给一个string。必须要实现的抽象方法叫做Co group。那这里我们想要做的操作呢,其实也非常的简单,就是把两条流里匹配的数据直接拿出来做一个字符串拼接,拼接成字符串直接输出就可以看到Co group和window draw的区别了,诶,所以这里边我们干脆就直接输出,哎,collector.collect啊,那里边我们输出的结果就是这个变量名字叫做T,然后我们加上。
07:14
一个箭头。然后加上特一拼在一起就可以了,然后接下来我们直接可以运行一下,看看效果跟之前的window状有什么区别。之前的温度转我们都是一条元素,然后一个箭头另外一个元素,那现在我们看到的呢,诶,这就变成了一个集合,然后一个箭头指向另外一个集合啊,所以我们看到零到五秒这个窗口内呢,诶,那其实当前收集到的就是A的一二秒条数据,那同样第二条流里边收集到的也是A的三四秒两条数据。那对于B呢,就只收集到一条数据,所以就是一个数据元素的集合到另外一个数据元素的集合,哎,那同样五到十秒里边只有B的元素,那么同样每条流里边只有一个元素匹配到,那么同样也是这样的一个形式。
08:11
那假如说我们把它都放到改回最初的形式啊,都放到零到五秒这个窗口内,如果是温度状语的话,它输出的数据会有八条那么多,那现在如果是Co group的话,会是怎么样呢?那我们就会看到它的数据肯定就非常的少。我们看到那就是A对应的有这样的一个集合的输出,B有这样的一个集合的输出,仅此而已啊,那别的什么东西都没有了,那如果说我们这里边有一个数据,比方说B的这个第一条流里的数据,它是单独的,它属于五到十秒的窗口,根本跟它没有对应的匹配,那这又会发生什么事情呢?我们会发现啊,这个单一的一条数据,没有匹配项的数据其实也会输出出来,哎,所以这就是我们说的啊,不光可以做内连接,也可以做外连接,这就是Co group的用法。
我来说两句