00:00
了解了窗口的概念和分类,那接下来我们就可以在代码当中去做一个实践,看一看怎么样用窗口去进行数据的处理和计算了啊,那对于flink而言呢,窗口其实也是一种特殊的啊,所以它是一个算子,窗口算子那对应的呢,就是基于data stream去调用一系列方法,这些API我们就叫做窗口API window API啊,那它可以看成就是data stream API里面的一小部分。所以接下来呢,我们先来对它做一个整体的认识,看一看啊,在代码当中去定义窗口操作到底是一个怎么样的流程。那首先我们最先要确定的其实就是当前的窗口计算是否要进行按键的分组,或者说分区操作。对应在代码当中呢,当然就是说在调用窗口API之前,我们到底有没有做过K啊啊,那像前面我们其实也讲到了啊,如果说我们这里直接按照用户名user去做了一个KBY的话,那接下来我们开的这个时间窗口啊,比如说这里的滚动窗口,那就应该是针对每一个用户,然后依次开窗,按照时间去截取一个一个的数据。
01:18
每一个用户都是这样的。最后统计输出的时候,诶,在第一个窗口要关闭的时候,那也应该是USER11个统计结果,USER21个,USER31个,这就是KBY之后的样子,那假如说我们当前。不按照某一个K去进行分组的话,所有的数据都在一起,诶,那就会出现这种情况,那就是开一个窗口,那不同K的数据全部都在一起进行统计。啊,那这两种方式呢,其实在代码的调用上是完全不一样的啊,所以我们可以先看一下按键分区的这种情况,我们创建的就把它叫做按键分区窗口啊,K的Windows那就是先要经过一个K操作,然后接下来啊,那我们再去调用一个点window方法去进行窗口的定义。
02:11
那我们知道K败的时候,相当于我们会按照当前K的哈希值把所有的数据分配到不同的分区上去。所以接下来呢,窗口计算的时候,就会在多个并行子任务上同时执行,注意这里边并不是在每一个分区上单独执行,不仅仅是这样,他还会针对每一个K去进行单独的执行啊,所以可以这么认为啊,就是每个K上我们都单独的做了一组窗口的定义,独立的进行统计计算啊,这就是按键分区窗口的一个调用形式。那假如说我们在前面不做KPI呢,能不能直接开窗呢,也是可以的,诶那就是创建的是一个非按键分区的窗口。它调用的方法就不再是点window了,而是直接调一个点window or。
03:03
哎,这里我们需要注意的就是说点window这个操作啊。是要把所有的数据都放在一起去进行统计计算,所以哎,那它其实就只能在一个并行任务上执行,相当于并行度变成了一,而且我们调大并行度都没用啊,那所以在实际生产应用当中,这种方式我们要谨慎处理啊,一般是不推荐大家直接使用window or。我们也可以到源码当中去看一下啊,比方说我们点开一个data stream,我们查看一下它的所有方法啊,我们敲window这里大家会发现啊,没有直接点的操作,只有WINDOW2啊,那当然了,上面还有这个time window2和count window2啊,我们会看到就这些方法,Count window2还是存在的,但是time window2已经被弃用了啊,那所以这里最一般的方法就是WINDOW2。而如果说我们在这里做了K的话。
04:00
我们知道得到的是一个kid stream k stream里边再去查看它的方法啊,这里就有了window啊,当然也有time window和count window啊,啊,那我们看到window得到的是一个window stream。相当于我们现在的data stream又做了一个类型的转换,转换成了window stream,所以接下来呢,我们其实是要基于这个window stream再去做一些调用啊,比如说哎,你看我们这里可以做reduce,做聚合aggregate,更加一般化的聚合,还可以apply啊,做应用process做处理啊,当然了也可以有这个max做一些简单的这些聚合计算,所以经过这些计算之后,那就由window stream又得到了一个data stream。啊,所以我们会看到啊,就是这个数据类型的转换,其实是这个样子,最初我们是一个data stream,我简写成DS,诶那么基于它我们可以先做一个K。
05:00
得到的就是一个kid stream。然后stream呢,又可以经过window操作去进行一个开窗,得到了一个window stream,然后window stream又可以做一些聚合计算,比如说这里的some,或者说aggregate。就再次得到了data stream,所以我们看啊,这一整套还是基于data stream进行的处理转换啊,那当然了,前面我们知道这个k stream也可以直接做聚合得到data stream啊,那所以它们之间的转换方式是这样的啊啊,那另外我们看到还有就是基于data stream也可以直接开窗啊,哎,那假如说这个直接开窗之后得到的是什么呢?我们看到。WINDOW2之后得到的这个流叫做all window stream,跟刚才那个window stream就多了一个or啊,然后这个all window stream呢,其实后面也是一样的,我们看也是做各种各样的这个聚合计算啊,聚合完了之后得到的又变成了一个data,所以整个这个转换过程都是完全一致的,只是少了前面一步KBY操作而已啊,那后边呢,因为我们说这个our window stream啊,做这个our window操作之后。
06:14
把所有数据都放在一个窗口里面,这种操作呢,并行部只能是一,所以一般实际生产应用当中不推荐,那后边我们大部分举的例子就都是KBY之后再开窗这种按键分区窗口的一些应用。所以整体来看的话,代码当中窗口API的调用就应该是这样的形式,那就是基于一个data stream,先调K,指定当前的按键分组,然后接下来调点window方法,这里呢,其实要指定的就是一个window a sign,这是一个窗口分配器。然后接下来呢,再调一个聚合方法,或者调一个处理方法,这里边其实要传入的是一个window function,一个窗口函数,所以我们可以看到它的数据类型转换其实是基于k stream,先转换成window stream,然后聚合之后再返回得到一个data stream,那这两步操作我们就可以分开,一个就是指定窗口分配器,它主要是用来定义窗口的类型。
07:19
接着呢,又要加上一个窗口函数,这定义的就是窗口要做的具体的处理计算操作啊,那这就是关于窗口API的一个整体介绍,当然了,在window和A之间,我们会发现在window的stream里边。除了这些聚合计算之外啊,另外我们看到还可以allow lateness啊,还有只trigger trigger,前面我们说这是触发器嘛,它还可以定义触发器啊,还有一些所谓的其他API可以插在中间,这些我们会放在后边进行讲解。
我来说两句