00:00
下来我们就给大家讲讲flink table API里边的窗口啊,那前面我们讲到的是这个事件时间啊,时间语义和这个时时间字段的定义,那这个光定义了时间这个其实没什么用,它具体发挥作用其实要配合窗口操作的啊,所以我们现在呃关心的啊,比较比较关心的,那当然就是说在table API和弗CQ里边到底怎么样开窗口,然后怎么做这个窗口的统计计算呢?啊,接下来我们来看一看。在弗林table API里边啊,主要有两种窗口,一种叫。Group Windows,另外一种叫over Windows啊,那这个group Windows有时候给他做这个翻译啊,就翻译成分组窗口对吧?啊,那言下之意这个也比较简单,就是说我要去做group啊,那根据某个字段对整个的数据做分组,然后呢,基于分组的数据再去开窗,开窗口,然后哎,定义一些聚合规则,得到这个窗口内每个分组数据的一个统计结果啊,所以这里边其实就是涉及到两个步骤,一个就是诶那那当然了,就是。
01:13
大家可以认为是三个步骤啊,就是一个步骤是要分组,然后呢,哎,我还得开窗对吧,然后后边我还得再定义一个聚合函数,做一次聚合,这就有点像什么,有点像我们之前那个datat stream API里边给大家定义的那个K,然后window对吧,然后做这个,呃,那个后面不是有那个窗口函数嘛,Window function嘛,所以就相当于是这三步啊,但是在table API里边调用的过程略有不同啊,它不是说先KBY,或者说大家认为先group by对吧?啊,它就是直接先那个点window了,直接做这个window开窗操作了啊。后边我们再去指定当前那个以什么作为K做分组啊,这是这个group by group Windows分组窗口,另外还有一类呢,是over Windows,这个大家应该也比较熟悉啊,就有些地方可能会把它叫做呃开窗数啊,这个其实跟大家之前熟悉的这个像have里边啊,提到这些开窗函数是非常接近的,它说的是什么呢?它就不是,就是呃,相当于开一个窗口去分组,去截数据,把数据分配到不同的窗口里边去统计,它是什么呢?它是针对当前,我们这不是表吗?针对当前表里边的每一行。
02:30
然后呢,在它的周围范围内,上下范围内截取一组数据,一堆数据去做一个聚合,得到一个输出结果啊,所以大家可以认为就是说group Windows呢,是啊,相当于是把我们的那个整整张表相当于就压缩了,对吧,就相当于折叠了,因为你分组了嘛,分组那当然最后就是一组里边一个一个结果,一组里边一个结果,那我们窗口相当于大家可以认为是一个特殊的组嘛,啊所以最后它的它的这个效果是这样的。
03:02
那这里面的这个over Windows呢,它的特点是相当于我们原来的窗口,呃,原来的表有多少行,长什么样,后边聚合之后呢?啊,当然那个数据类型是变化了,这个跟自己的这个聚合去定义啊,但是呢,它是每一行对应都有一个结果,每一行都有一个结果,有点像是一一对一匹配的那种状态啊,这就是这个两种不同类型的窗口。那我们具体来看一看啊,首先是group Windows group Windows,大家会发现在这个table API里面,它这个比较统一,也没有什么简写方式,也没有像我们之前那个直接点time window,点点那个count window,对吧,这里边这个group Windows呢,就直接就是点window,后面那个over window,其实也是直接点window,然后它里边传什么参数呢?诶里边要传一个就是所谓的group window。哈,就是这个group window,就是table API里边的一个这个又一个数据类型了,对吧,它的呃定义主要是要什么呢?那就是要有相关的一些那个语义的描述,比方说呃,后面我们会讲到啊,就又划分各种各样不同的类型的窗口,这个窗口跟我们前面讲的流处理的那个窗口就一致了,滚动滑动绘画对吧,就是又是这样的一些类型。
04:21
然后这里边大家注意啊,在呃弗link现在提供的table API里边,你要去做这个,呃,就是这个group去做分组的话,它一定是基于某个时间字段啊,所以后面这个窗口你还得定义那个时间字段。然后还有还需要注意什么呢?就是它后面一般情况我们要给一个别名S,比方说SW。啊,那也就是说后边相当于我们在这张表里边就多了一个字段叫做W,这个W是什么呢?哎,就是当前开的这个窗口。啊,这是当成了一个特殊的字段来对待,所以后边你要做这个窗口聚合的时候呢,注意啊,Go by这里边,哎,我这里边就必须要把对应的这个窗口的别名也传进来。
05:09
因为你后边做那个分组统计的时候啊,你是不是如果你有这个ID的话,那你得有对应的这个ID也也传进来,对吧,按照这个K来做分组,那我们现在是既然是要做这个窗口聚合,那是不是窗口也必须要按照它来分组啊,那你要不然的话,那个分组就没有意义了嘛,所以这里边这个窗口的别名啊,是必须要传传入到后面这个group里边来的。啊,这是这样的一个过程,然后后边呢,Group得到结果,接下来就select对吧?哎,大家大家可能想到,诶,你不是说那个group之后,这个开窗之后得有那个聚合操作,得有窗口函数吗?这里面怎么直接s select,这好像是个简单的转换操作啊。哎,不要着急,大家知道我们平常写CQ的时候,你怎么写,你不也是select什么字段出来吗?那那个聚合在哪里体现呢?哎,是在你select的时候,嗯,对应的那个字段要有一个聚合对吧?比方说这里面我们直接求和,哎,那就是比方说B这个字段要求和的话,Select当前的这个聚合的这个K对吧?把K拿出来,然后呢,提取它点上啊,做一个聚合,这样就可以了。
06:18
这就是这个呃,Group啊,这个窗口的一个用法,整体的用法,它就是这么来做。呃,然后我们给大家说一说有哪些不同的类型,那首先就是滚动窗口。滚动窗口的定义大家看啊,要用一个一个类啊,提供就是在这个table API里边啊,本身这个group window并不是我们自己可以实现的,接口都都是给我们定义死的,你必须这么来用,对吧?啊,那这里边table API呢,提供了一组有这个特定语义的预定义的这个这个group window啊,这个类,那比方说我们最熟悉的那就是滚动窗口对吧,这个类就叫做TB。啊,然后这里边的这个语法呢,大家看这是用空格这种方式啊,你如果要想用这个点儿,然后什么,然后去去传参的那种方式也可以啊,我们这里面直接用scale特殊的这种写法,这个看着就非常舒服啊,对吧,大家看这种写法就是啊怎么定义呢?Tumble这个类里边有个方法叫over啊,那就是tumble over。
07:19
10MINUTES啊,那就是十分钟的滚动窗口对吧?啊,所以over后边传的就是窗口的大小,滚动窗口的大小啊,然后呢,On row time这表示什么呢?啊,就是当前你不是这个要要要这个开窗口吗?那窗口到于基到底是基于什么去开呢?啊大家可能想那窗口嘛,那还有有什么好说的吗?窗口不就是基于那个时间字段去开吗?之前我定义了什么什么时间字段,定义了什么语时时间语义,我就用对应的那个字段不就完了吗?要注意啊,在flink CQ里边,大家知道CQ底层本身是没有,就是我们这里边滚动窗口,滑动窗口的这个概念的,对吧,所以这里边它是相当于什么呢?把相当于我们是自己定义了这样一个新的列,对吧,定义了一个这个新的字段来去做操作的,所以你在定义这个字段的时候呢,必须要明确的告诉我。
08:18
我们的代码,你当前的这个字段,它是基于什么时间,基于哪个字段,然后去做分组去做统计的啊,所以说这里边必须还得指定当前的时间字段啊,有一个on对吧,On road。然后后面as这是给个别名啊,这个别名呢,必须出现在后面group by里面,对吧,必须要基于它去做分组。啊,所以这是这个。这是这个事件时间语义下的滚动窗口,然后同样呢,我们可以定义这个处理时间语义下的滚动窗口,那它的区别就在于on,这个我们要定义之前的那个pro time,对吧?把那个字段拿过来,然后asw,那同样我们还可以定义技术窗口啊,对吧?这里边这个计数窗口怎么样定义呢?啊,这里边就是你over的时候,大家注意啊,Over的时候定义这个时点,不要点时间对吧,直接定义一个十点Rose,这样它就是统计十个数据,构成一个滚动窗口去做统计。
09:23
啊,这这就是一个计数窗口了,类似于后边他还必须得有on,就是这个on什么呢?还是on pro对吧,因为你现在是计数窗口嘛,统计之前的这个个数就可以了啊,但是你如果想要按照row time的话也可以啊,它就是按照row time排列的这个之前的十个对吧?那这这个看起来就跟我们呃想要的那个十个接一个,十个接一个,好像有点不太一样了啊,所以这个就看大家具体的这个定义,按照我们之前data stream里边的那个呃,技术窗口的定义的话,那应该是pro。啊,所以这就是不同类型的定义,同样与之对应的呢,还有这个滑动窗口,滑动窗口这个类就变了,不是tabo了,变成了这个slide啊,别的呢,基本上都差不多,不同的就是说OVER10分钟,这是窗口大小,还有大家记得这个slide的窗口,滑动窗口还有一个滑动不长啊,所以后面它还有一个EVERY5MINUTES,这就是表示五分钟滑动一次。
10:23
后面同样还是指定当前,哎,你是哪个时间字段对吧,Road time pro time,然后SW,同样就是说你如果要是技术窗口的话,那就前面的这个时间你就都是over,哎十行对吧,然后every五行去做这个滑动,这就可以了。啊,最后还有这个会话窗口啊,我们前面讲的这个窗口类型不就这些吗?会画窗口这里边就没有技术窗口了,那就只有时间窗口啊,那事件时间语义下,这里边我们要什么呢?啊,这个类是session啊,就叫session session我们要传的参数是with GA对吧?到底是隔多长时间截一个绘话窗口,这里边给一个十分钟后边对应的字段传进来,那这就完事了。
11:05
这就是这个在flink代码里边啊,Table API里边对于这个所有窗口的一个定义啊,注意这里边的窗口都是group Windows,这都是这个分组窗口。然后另外还有一部分是这个over Windows啊,这个我们可以放到下节课再讲吧。先给大家讲到这里。
我来说两句