00:00
我们已经了解了按键分区处理函数K的process function,这是处理函数里边可以说最重要的一个啊,那接下来呢,我们再来简单的说一说窗口处理函数,也就是所谓的。Process window方式啊,那其实我们知道开窗之后啊,同样是可以调用process操作,那process这个方法里边要传入的参数就是一个全窗口函数,那全窗口函数呢,有两种形式,一种是window function,另外一种就是process window function,哎,那所以我们所说的这个窗口处理函数呢,本质上来讲,它其实应该是属于一种全窗口函数,所以我们会发现啊,它里边使用的方法可能跟我们前面介绍的process function k的process function略有不同啊,但是我们也可以把它算成处理函数大家族里面的一员啊。与之对应的还有另外一个就是不做KBY直接开窗,基于all window stream去调用process方法传入的一个process or window方式,那这两个其实是完全一样的,所以我们只要看process window方式就可以了。
01:04
那对于窗口处理函数在代码中的使用呢?之前我们也已经比较熟悉了,我们曾经做过测试,在window function test这一节里边,我们就曾经实现过这样的一个process window function啊,那它本身呢,我们看到里边它其实是一个抽象类,它也是直接继承自负函数类的啊,所以这一点的话,跟其他的处理函数还是很像的啊,然后我们看里边呢,它不是process element了,它要实现的这一个抽象方法就叫做process。那当然了,里边所要拿到的东西,它是有一个K,另外还有一个上下文,这个都一样,还有一个输出的out,另外还有一个elements,因为它是窗口处理函数嘛,它要把当前所有的窗口里边的数据要捕获到,它是全窗口函数,所以所有的数据都会保存在当前的算子里边。然后我们看到下边还有一个clear方法,Clear方法当然就是让我们去相当于做一些收尾清理的工作的,这里边最重要的呢,就是这里的context,这里的context上下文跟之前我们所说的处理函数里边的上下文有所不同,因为当前的上下文里边有window啊,这就是我们说的啊,全窗口函数可以包装窗口的信息,它是通过这里的context上下文来捕捉窗口信息的。另外呢,诶,我们看到熟悉的了,可以去获取当前的处理时间,获取当前的watermark,这其实在之前我们的key process function里边啊,都是timer service里边的一个方法,它在这里呢,直接包装在上下文里了。
02:42
也就是说process一个方式里边是没有timer service的,诶,那我们看到了,之前timer service除了获取当前的时间之外,还能注册定时器啊,但现在看起来好像就不能注册定时器了。这里边能做的操作还有什么呢?它是可以直接获取当前的window状态和全局状态,Window state和global state这两个东西可以拿到,另外还有一个就可以调用output的方法去指定一个测输出流,哎,那所以我们看到啊,就是有些东西是有的,但是有些东西它没有,至于它多出来的这两个状态呢?诶,那我们想到对于普通的process function,它也不关心我们当前的窗口状态呀,无所谓窗口不窗口嘛,而如果想要做状态编程的话,既然它是。
03:31
我们所说的负函数类,那自然也可以自定义,所以这个是完全没有问题的,那现在就相当于窗口处理函数里边进少了之前我们对于定时器的定义,这样的话我们就会觉得受到了非常大的限制,我们本来说处理函数里边最给力的武器啊,就是去定义一个定时器,做这个时间上的控制,那现在没有定时器了,那这个窗口处理函数还能干什么呢?啊,其实窗口处理函数能做的事情确实就只有这些,但是呢,在窗口里边还有另外一种方法可以去定义定时器,其实我们仔细想一想的话,窗口操作。
04:11
本身它不就是一个定时器吗?啊,本来就是基于当前窗口的结束时间啊,其实我们知道底层它不是基于结束时间,是基于当前的max time step最大的时间戳注册了一个定时器。如果我们还有印象的话,应该会记得当时在介绍窗口的其他API的时候,曾经介绍过一个叫做trigger的这样的一个API啊,那在这里边我们可以直接调用这个trigger方法,里边传入的就是一个trigger啊,那这个trigger呢,我们当时说它有具体的时间,比如说事件时间,窗口里边我们直接就定义的是一个even time trigger。那么在这个trigger里边呢,我们看到on element方法来了数据之后,就会基于当前窗口的最大时间戳去注册一个事件时间定时器。
05:02
啊,那所以在这里边我们就发现了啊,这个trigger里边的上下文,这个ctx,它里边是有register even time timer这个方法,所以我们就可以点进去看到啊,这里边的方法有哪些呢?呃,可以获取当前的处理时间,获取当前的water mark,另外还可以注册处理时间定时器和事件时间定时器,另外还可以删除定时器,那这个功能就跟我们之前所说的。Time service非常的类似了,而且它的功能还更多啊,我们看到它的上下文里边还可以获取当前的状态啊,对应的这些状态也都能够拿到,所以我们会发现啊。窗口算子里边的设计,哎,它其实是把对于时间的操作全部提取到trigger这个触发器里边进行操作了啊,因为我们想到了时间窗口的触发,这本来就是一个定时操作嘛,诶,所以他干脆就让触发器把所有的这种时间上的操作全部管理起来啊,那所有数据的操作呢,那就放到窗口函数process window function里面来处理,哎,所以这样就是时间归时间,数据归数据啊,这是关于窗口处理函数的用法,我们只要简单的回忆一下就可以了。
我来说两句