00:00
那接下来我们已经知道了在table API里边怎么样去定义时间语义,定义时间属性,那我们知道时间属性本本身不是目的,要配合窗口操作,时间的特点才能发挥出来,对吧?呃,所以接下来我们给大家讲一讲table API和flink CQ里边的窗口,那在TAPI和弗Li CQ里边主要有这样的两种窗口,一种叫做group Windows啊,有时候我们直接给它翻译叫做分组窗口,另外还有一种叫做over Windows啊,这个有时候不太好翻译啊,我们可能就直接管它叫做这个呃,开窗函数对吧?啊,就类似于我们之前在汉里边见过的那样的开窗函数,类似的这样的一些东西,那主要它们的区别在哪里呢?Group Windows比较好理解,它主要的特点就是根据时间或者我们的那个技术的间隔,这就相当于是要开时间窗口还是开技术窗口,对吧?哎,我们就是指定当前这个。
01:00
N组的这个标准,我们把行对应的每一行的数据聚合到有限的组里边去,然后呢,对每个组里边的数据执行一次聚合操作啊,所以在这个group window里边,首先我们是要定义这个window长什么样,然后呢,其次大家想到你既然是要分配到不同的组里面嘛,Group嘛,是不是肯定需要去定义当前group by的一个K啊,啊,就肯定得有一个K作为分组标准,对吧?啊,那最后还得定义就是对应的操作聚合函数,这就类似于我们之前在讲到那个get three API里边的window操作的时候,必须要有一个窗口分配器,后边还要有一个窗口函数,对吧?啊,窗口分配器决定当前窗口到底长什么样,数据怎么分配,而后面的这个窗口函数代表我们到底执行什么操作,那这里边多了一步,就是需要去做分组,那这个分组其实也很好理解。
02:00
之前我们做那个窗口操作的时候,不也是正常情况下一般都要先K拜吗?K拜不就是先分组吗?哎,所以这里边其实只是把我们之前的那个过程稍微调了一调顺序而已啊,那至于这个over window又是什么样子呢?啊,大家可以回忆一下之前讲过的这个开窗函数啊,它主要的特点是针对我们当前每一个输入的行,对吧?然后呢,它要计算的并不是说就是所有很多个数据,哎,我我我直接就聚合出一个结果就完事了,而是说针对每个输入的行都在它相邻的这个范围内,把很多行聚合起来得到一个结果,每一行都跟相邻的去聚合得到一个结果,对吧?啊,所以这个聚合完了之后,相当于我得到的还是就应该是每一行都有一个聚合结果,这相当于还是一个表啊,跟我们这个分组窗口就不太一样,分组窗口大家就知道了,就是应该是一个组里边有一个结果,对吧?啊,相当于我们最后得。
03:00
得到的这个结果应该是一个规约化之后的状态,而这个over Windows呢,得到的是就是一样的一一行对应一个结果啊,这是整体的一个概念,那接下来我们就分别来看了,首先来看一看所谓的group Windows group Windows这个分组窗口,它在定义的过程当中也非常的简单,我们就看一下这一个具体代码里边的调用方式啊,就首先基于啊,这里面应付的就是一张表啊,本来我们定义好的一张表啊,Table基于它去调用点window方法,那么点window这个API操作里边要传的这个参数是一个,哎,当前这是一个这样的一个group window,必须要传一个group window,然后呢,而且后边必须要用as词句指定一个别名啊,大家看这个写法,就是前面我给一个group window放在这儿,然后比方说SW,也就是说我当天这个窗口定义出来,哎,长什么样的一个窗口,比方说。
04:00
整动滑动对吧,大家想到之前我们那个时间窗口啊,呃,那后面呢,叫做W,那这个W要干嘛呢?后面我们注意要分组对吧?对所有数据,呃,开了这个窗口之后,然后我们要去分组,分组的时候呢,大家看我们的当当时前面定义好的这个窗口的别名就必须要出现在group by的这个它分组的这个标准的K里边,也就是说接下来分组我就必须以每个窗口作为一组,对吧?啊然后另外比较推荐大家的呢,还要再给一个字段,就是作为我们本身在这个数据里边他们的那个K那个比方说ID,像我们这个SS4例子里边SEN4ID,那就相当于是本来就应该按照这个去分组,对吧?然后窗口呢,我们在统计某一个时间范围内,或者某一个技术范围内所有数分组做一个统计结果,所以一般推荐大家就是要把前面定义。
05:00
的窗口别名,以及另外一个我们分组标准的K放在这里作为group by的参数啊,那有同学可能想,那我不给这个另外的这个分组的这个标准行不行呢?啊,当然理论上也是可以,就是你只要有这个前面定义好的窗口这个字段在这儿就够了,那你如果要是不给定义那个我们额外的那个K的话,那不就相当于就是我们之前那个data stream来了之后直接开窗不做K吗?啊,那所以最后得到结果就相当于WINDOW2嘛,最后他会把所有的数据都集中到一个lo上去执行,就是底层,我们想底层不是还要翻译成data streamam吗?那它最后就相当于一个WINDOW2啊,那这种其实是会损失我们整个代码运行的并行度的,并行度就变成一了嘛,啊,所以不推荐大家那样做啊,最好这里边肯定是要至少给一个当前分组的标准,一个ID的,然后后边我们就说了,哎,基于这个窗口,你要指定做什么聚。
06:00
的操作对吧?哎,这个聚合操作可以单独指定,也可以直接select select的时候大家知道select是提取这个字段吗?提取字段的时候直接调我们系统里边提供好的这些聚合函数,比方说B点萨对吧,这就是一个聚合操作嘛,啊,这个其实整体来讲还是非常简单的啊呃,那table API里面其实就是提供了,这里边大家看到别的这些我们都已经明白怎么去写了,关键就在于前面这个group window这里还是一个,还是一个泛泛而止的一个类型,对吧?哎,我这里边还没有真正把它写出来呢,那怎么去定义这个group window呢?Table API给我们提供了一组预定义好的这个类,也就是说这些你就不要再想自定义了,对吧?这些就是对于这个特别对于table API而言,上层的API都是现成的东西,你拿过来用就完事了啊,那这些类其实最终就会被转换成我们底层的那。
07:00
啊,Data stream或者data set的那个窗口操作好,所以接下来我们看一看到底有哪些类呢?诶这里面大家看到这就是非常熟悉的东西,老熟人来了啊,首先滚动窗口对吧?你说这个它不是分组去做聚合吗?那就相当于我K败之后去定义一个,比方说哎,我可以定义一个时间滚动窗口对吧?你看现在我现现在这个基本语法是什么呢?是一个tumble tumble就表示我现在定义的是滚动窗口,然后呢,Over over什么呢?后边这个十分钟,这就表示当前窗口的长度,窗口的大小,Size,然后后面还有一个on on这个字段指什么呢?哎,就是表示我当前到底是基于哪个字段去做的这个窗口的分配,对吧?啊就是我可以基于当前的事件时间字段,呃,就是我基于这个事件时间去进行这个数据的分组的话,哎,那我就是以这。
08:00
Row time作为标准的啊,所以这里边window window10分钟的这个滚动窗口,On row time,然后给一个别名SW,这就是一个事件时间的滚动窗口,十分钟长度的一个滚动窗口啊,那当然我们还可以定义这个处理时间的滚动窗口,对吧?它就是给的这个时间特性,这个字段不一样了,我们要用前面定义好的数据里边的那个已经有的那个处理时间的字段,对吧?Pro,那另外还可以定义,就是我可以不定义这个十分钟,大家看这个表达式是一个直接一个整数,然后掉了一个点minutes这样一个方法,对吧?好像是这样一个方法调用,这就表示十分钟。然后另外可以怎么样呢?十点Rose,它就表示这就不是时间窗口了,这是一个技术窗口对吧?哎,滚动的技术窗口,每十行数据,然后那那我这个十行数据是基于什么去做这个,呃,排序做做这个分组呢,排序我要指定一个当前的时间字段,对吧,我基于处理时间把它们。
09:05
从上到下排好队,然后呢,每十个我取一个取一组对吧?哎,所以这是这个当前我们对于这个滚动窗口的一个定义,那有滚动窗口当然就有滑动窗口了,滑动窗口非常同样非常好理解,Slide对吧?它这个不叫slide顶叫slide啊slide然后over窗口长度,注意滑动窗口里边不是还有不长吗?哎,不长,这里边用什么呢?Every every5minutes.minutes那这就是哎,就是十分钟长度的滑动窗口,每隔五分钟滑动一个一个窗口距离对吧?诶,那就相当于这是一半嘛,从一半一半重叠一半啊,继继续继续开始处理对吧?这就相当于是这样的一个场景而已啊,所以本身这里的定义其实还是呃,非常简单的啊,然后同样后边我们要指定当前的时间字段,然后给一个别名,所以我们可以分别定义基于事件时间的滑动窗口啊,基于处理时。
10:05
边的滑动窗口,另外还有按照处理时间排序的这个技术窗口,对吧?哎,这这个就是可以有各种各样的这种定义方式啊,然后另外还有一种特殊的窗口,就是所谓的会话窗口啊,Session window,这里边也可以定义,定义方式是什么呢?Session session,然后大家记得我们需要有一个GAP对吧,定义一个就是所谓超过这个时间间隔的话,就开启下一个窗口,前一个窗口就关闭,那所以这里边呢,有一个参数就是withk,然后传一个时间间隔,那就是如果相隔超过十分钟以上的话,那我们当前的会话就关闭了,然后同样后边我可以指定时间字段,然后给一个别名对吧?啊,那就有基于事件时间的会话窗口,基于处理时间的会话窗口啊,这其实就是关于这一个group window跟我们之前data streamam API里面的window定义几乎是完全一样的,好,前面我们已经知道了table API里边。
11:05
怎么样去定义窗口,怎么样去做窗口操作group window怎么样去开,那接下来给大家说一说CQ里边怎么样去定义Windows啊,哎,这里边其实也非常简单,它其实主要就是干什么呢?就是用一个类似于函数一样的方式,然后把它定义在CQ查询的group by子句里边就可以了,也就是说我们调用的时候呢,你直接去写一个group by什么呢?呃,然后定义这样一个窗口,以这个窗口去做一个分组,对吧?诶直接把这个放在里边就可以了啊那这里边有几种定义的方式,首先滚动窗口这个对吧?里边传两个参数,注意第一个参数是一个时间属性的字段,那同样还是当前你这个滚动窗口基于哪个时间字段来来做判断做区分呢?哎,就是这个啊事事件时间和处理时间都可以,然后后面还有一个窗口的长度,当然是一个参数,那同样还可以定义滑动窗口了,滑动窗口呢,大家注意。
12:05
但不是slide了,这个有点特殊啊,叫hop hop大家知道是那个,呃,蹦蹦跳跳对吧,就是跳的那个窗口,所以它这里边相当于不是说滑动,这是一个跳动窗口对吧?啊,那这个跳动窗口我们再去定义的时候,里面大家看到就多了一个参数,首先前面呢,还是一个时间字段,然后后面是两个时间间隔interval,注意这个时间间隔大家要注意一下啊,第二个大家可能直观理解的话,应该先传进来的应该是一个size,后面是布长对吧,它刚好反过来,第二个是滑动布长,第三个是窗口的长度啊,所以这个大家稍微注意一下啊,就是有时候如果搞错的话,搞反的话,会导致出现一些比较奇怪的结果输出,那另外还有就是session window了,绘画窗口同样定义一个session里边传两个参数,第一个是时间字段,第二个就是啊间隔时间对吧?啊,就把这个传进去就完事儿了啊,所以这就是关于在代码里。
13:05
Group分组窗口的一个应用。
我来说两句