00:00
那分组窗口,那接下来我们再看另外一大类窗口,那就是所谓的over window啊,其实大家知道这个over over这个操作啊,Over的窗口聚合其实标准CQL里边本来就有的,它本来就有这个over子句,对吧?啊,其实在这个呃这个呃,MYMYSQL里边,就是MYSQL8之后,应该也是引入了相关的一些特性啊啊那么我们一般定义的时候呢,都是在查询的这个select的子句里边直接去做定义的,那大家如果要是联系之前呃,Have里边学习过的开窗函数的话,对这个应该就更加熟悉了,对吧,这个用法非常的。接近啊,非常类似,它跟group window不一样的一点就是group window是真的要group by要做分组,然后是每个组里边是不是聚合出一个结果来,哎,所以大家看它其实有一个真正意义上聚合规约的一个过程的,最后就得到了一个结果,数据变少了,而这个over window呢,它其实是针对每一个行,然后是不是要计算相邻行范围内的一次聚合呀,那每一行都对应一个结果,大家想最后其实是在我们这个表里面,是不是相当于追加了一个字段啊。
01:11
啊,对吧,呃,就相当于我们这个表还是原来的这个维度,然后后边其实是可以追加这样的一个一个字段啊,作为一个聚合结果就可以了,所以它的使用也会不太一样,那自然我们就想到了在table API里边是不是还是点window,前面我们也看到了window是不是里边可以传一个over window啊啊所以大家看啊,直接上来之后基于一个table.window。里边传一个over window,注意这里边over window也得as一个别名对吧,也得告告诉我后面这个是到底是哪个别名,那有同学可能想到,那后面难道是还要group,还要分组吗?哎,不是的啊,这个边名的用法就不是分组了,而是后边我们在做聚合操作的时候,是不是要有一个这个over这样一个说明啊,基于哪个over窗口去做对应的这个聚合统计对吧?所以大家看后面就直接s select,然后比方说b.sum over这个对吧?c.mow啊这就是这个over窗口的一个使用啊,那我们使用的过程当中也是table API有一个。
02:18
啊,预定义给我们写好的一个类就叫做over,对吧,就像前面那个tumble slide呃,Session一样,它是over,然后我们用的时候呢,就直接按照它的规则,一个一个调,一个一个配置就可以了,那具体的使用给大家看一下。我们定义over window的时候,可以定义两类不同的啊,就比方说首先是我们可以定义就是按照处理时间还是事件时间去做这个呃,排序处理对吧?另外呢,还可以定义,比方说你是按照这个时间去选取周围范围内的,还是按照这个技术行行号啊呃,截取这个范围内的其他的数据啊,那另外呢,还有两。
03:00
还有一种分类方式,那就是把它分成无界的over window和有界的window。什么叫无界的over window呢?简单来讲就是你开窗函数不是要开一个窗口,把上下附近的那些数据聚合在一起吗?我现在无界就是这主要针对我们当前这个这个流处理来讲的,那大家想是不是你说首先啊,我开这个开窗窗,开窗函数大家想我是排序之后上下范围内都可以取,那假如说我按照时间排序的话。我能娶到他之前的,我能娶到他之后的吗?我当前数据来的时候,我是来一个处理一个,对吧,我只能知道之前的呀,那你跟之后的这是没意义的,所以首先在我们当前的这个FCQ里边,不支持它去聚合自己之后的那个数据,只支持之前的聚合之前的数据,然后之前的数据的话,那就涉及到你到底是多长时间范围内呢,或者是到底是要去合几行呢,我这里边就有一个选择是。
04:02
别管我要聚合几行几行,我要聚合之前全量的所有数据,对吧,就到目前为止所有的数据都给我聚合起来,这是不是就是一个无界的一个定义啊,对吧,啊,就没有具体界限的一个定义啊,有多少聚合多少,那大家看一下这个怎么定义的,首先是over over这个类对吧,后边是只能调一个方法叫potential by。大家理解的话,Position by是分区的意思,这个分区是不是就像我们的分组类似啊,相当于也是按照分组来做来来做聚合了,对吧,也是按照一定的规则来做聚合了啊,当然了,这里面的这个position by是可选的,你如果要是不分组也行,对吧,直接就按这个数据直接就给就行了,然后后边这个order呢,Order,这是必须的order by,那就是你总得有一个排序对吧,要不然你说你截取这个上下范围内,我知道你要怎么截取的对吧?乱的话这个是没法截取的啊,然后接下来还有就是preding preding大家知道,其实就是指定前面多少对吧,那这里边如果是无界的话,它给的就是preding。
05:07
Unbounded range大家看这是一个固定的字段对吧?就是这么写的啊,一个常量,那unbounded range当然指的就是说对当前前面所有的数据,那当前的这个排序的这个原则,其实指的什么呢?指的是时间对吧?按照当前的这个时间来讲,全量的啊,无界的这个时间,那同样还有这个行数啊,按照行来指的这个无界,那就是unboed的肉对吧?其实大家知道这俩没什么区别对不对啊,甚至这个proceeding直接可以省略,省略的话默认指的就是无界对吧?所有的这些聚合就完了,然后最后再做一个S啊,这就是这样的定义啊啊,当然这个order by我们这里边也可以指定到底是按事件时间还是处理时间,这是不是就把它排出来了呀啊,这就很明显的一个排序啊,啊,然后我们再来看有界,有界的话基本上都一样,那主要就是proceed,这里边是不是就要给一个有限的有界的大小了,比方说。
06:08
PRE1,然后点minutes,这是不是就是以当前数据为准,一分钟之前啊,然后我当前现在是不是就是事件时间一分钟之前的所有数据啊,或者说我处理时间一分钟之前所有数据,另外还有就是按照技术来来考虑,那是不是ten.rose那就是。哎,大家看这是还是啊,我前面可以按照当前的这个这个这个rolltime,当前的这个视线时间来排序,然后我取之前的十行,那就是我只只取十条数据,不限制是多长时间范围对吧,只取十条啊,那或者我也可以按照这个处理时间排序啊,甚至你也按可以按照其他的一些字段排序,这都是没有要求的啊。这就是关于这个over window的一个使用啊,那当然对应还有CQ里边的写法,CQ大家应该就更更熟悉了,对吧?啊,就是这个本身CQ源语里面都有这个对应的子距嘛,啊目前大家注意啊,是只支持在当前行范围之前的,也就是说当前的这个调用的后面这个方法啊,本身应该是有preding,应该就还有following对吧,可以指定之前多少之后多少,现在是不能用following的啊,就没有办法指定之后的,只能到目前为止,这大家一想流失数据这个就很清楚了啊,我们看一下这个例子吧,诶,当年大家看到这个select count,然后amount,那这里边我有一个字段是amount对吧,统计当前的这个amount的这个数量,然后接下来over,这是不是就over子句,然后开一个这个开窗函数,啊,后面这就指定了position by user,然后order by pro time,然后Rose between2preing and current。
07:50
肉,这表示什么含义?对,这表示当前行以及前两行对吧?诶,所以这其实就是一个当前,当前这个按照技术啊去去做一个聚合统计的这样一个开窗函数,呃,那有同学可能想到了,假如说我这里想要去指定一个,指定一个时间范围呢,这里面用什么。
08:11
当然就是用range对吧?啊,Range between就可以了啊,那后面就是from orders啊,这就是一个基本的使用。好,基本语法都已经讲完了,那接下来我们还是在代码里边做一个测试吧,还是紧接着前面的这一部分代码啊。直接在这儿啊,接下来是5.2。开窗函数over window,呃,那首先还是table API的一个使用,这里边基于data table,接下来我要调一个window,现在是不是要传的是一个over啊?大家看这个over对吧,直接就放在这儿了,但大家发现了,本身我这里要的是一个over window,那这个over它是不是并不是over window啊。对吧,它本来也是一个final class啊,然后我们就发现了over里边能够调的方法。
09:04
哎,这就是我们看到是不是protection by和order by2个方法呀。这就是我们说的protect by是不是可选的一个方法,可有可无,那么order by必须后面大家看就能看到了啊,你看这个position by,我们先写出来当前over.position by,我现在要分区的话,肯定还是按照这个ID做一个分区,对吧?那这个position卖之后得到的这个叫做一个over window position。那么这个类里边,大家看它能调的方法是不是就只有一个order by啊,啊,所以大家想你前面直接order by,得到这样一个over window position的ordered也这样一个类型也可以,那或者是不是到这里先position by,再去order by。得到这样一个类型也是一样的呀,这就是我们说的。BY是不是可可选项可有可无是吧?所以接下来是order by只能叫order by。
10:02
Out的话,那这里面我们要的是那个RT啊,当前的那个事件时间字段排序,然后接下来。大家看下接下来是不是就是preding和as能调这两个方法呀,然后大家会看到preding得到这个类型,是不是还是over window position到order的这个position,这就是当前我们还是得到对应的啊,还是这个。这样的一个数据,呃,这样的一个类型,就是ordered proceeding这样一个类型,他再去调用的时候,是不是就只能再去调一个as或者following啊,那当然了,现在following没什么用对吧?啊,所以大家就知道后面就只能调这个as了。当然你如果要是感兴趣这个following的话,你看following得到的是不是还是position的ordered pre还是当前这个类型,对吧,所以他调来调去最后只能是一个S。好,所以这里边我们pre之前的多少数据呢?我这里边就用那个行行数来吧,比方说两行数据对吧,2.rose,然后后边大家看是不是就只能是as啊,Following没用啊,大家看是不是as得到的就是一个。
11:12
就是一个over window啊,哎,这个就没毛病了啊,这就是绕一圈又是按照这个定义又回来了,所以这里边over window我给一个别人叫ow。所以大家不要看这个类型转换好像很复杂,因为调用的时候它只有这一种选择,对吧?啊,所以你就直接按照这个规矩啊,一个一个不停的往后调就完了,但是这里边大家知道partition by和这个preing这两个是可选的,知道这个就行了,因为你基于这个order by之后的前面大家不是看到了吗?这个类不是直接可以调as吗?对吧,当然这个就就是可选了,那或者前面这里边大家看到基于这个over啊,我这里边是不是也可以直接调order by啊,所以BY是不是也是可选啊啊,所以这两个就是。
12:02
大家看一下这个API调用方式就知道了,那接下来我这并不是要group by对吧?大家看只有一个方法,是不是只能直接select对吧?Over子句只能放在这个select里边去用啊,那现在我要的是,呃,就是当前我定义啊,比方说我要当前的ID啊,比方说我要当前的这个,呃,这个当前的这个事件时间对吧?RT然后另外我还要当前的count到底有几个,这个窗口内到底有几个啊,然后后边我还可以指定,哎,注意这个count要聚合的话,基于over window是不是必须要有over啊,Over ow对吧?这个必须要加上啊,然后后边还有就是比方说我指定当前的temp的avg对吧,平均温度,然后over ow啊大家看就这样去把它选取出来就没问题了,玩一下啊,那这个我叫over over Windows result over result吧,就叫。
13:03
这是table API的一个实现,那如果我们要写CQ的话怎么办呢?啊,C口的话,那当然就是table env c query啊,因为表已经注册好了,我这里面直接写就完事了嘛,Select,呃,大家看这个上面是不是ID对吧?RT,另外还有count I,这个还是啊,给个别名as CT,呃呃,这里大家要注意这个要over对吧?我这里边需要over啊,比方说后面我单独给一个别名的话,哎,那我这里边直接给一个ow count ID over over ow,你想给一个别名叫CNT也可以啊,我这边不给其实也是没问题的,那后边就是。呃,这个average对吧,A temp,然后over o啊,这是我要提取的几个字段啊,首先先放在这儿,然后接下来呢,我就是不是from sensor对吧?我那张表注册的叫sensor啊,然后接下来,诶,是不是要要有那个开窗的定义啊,对吧,接下来要有那个window啊,Window o,大家看在这个CQ里边是这么写啊window o,然后as后面给一个大家看这个不是先定义窗口,然后as这个别名,它是直接声明window o,然后as后面给这个具体定义对吧?哎,那具体来了,接下来怎么写,Protect by对吧?Protect by,呃,当前的ID对吧?然后order by。
14:40
RT,对吧?然后当前的这个行数是不是Rose between?Rose between,然后两行之前是two preing and啊,当前行current肉,大家看是不是就是这样写啊?
15:00
啊,当然这个我是没有把这个大写啊,大家可能有些同学习惯那个写C的时候,把这些关键字啊,一些东西要大写啊,那我这里边直接就全小写了,大家知道意思就可以,跟前面我这里面的这个定义是不是一模一样啊,对吧?呃,基本上就是一完全一样。好,那所以接下来我们再把我我把上面这个,诶这个并行度是设的一是吧。所以前边我们的这个统计输出。哦,大家看到这里面这个是正常的,因为我们这里是六一十七,就是这几个,就是这里面的这几个字段,它是不是相当于是同时都是在这个30秒窗口关闭的时候要输出的呀。对吧,所以大家知道这个其实本身他们分区,这就是要同时输出,那我这里边最终并行度只有一的话,它最终集起来的话,还是要有一个顺序的,所以这个顺序我们是保证不了的啊啊这个是没有问题的,所以这个并不代表我们是这个,呃,顺序都已经错乱是吧,因为他们本来就应该是同时嘛。
16:08
啊,所以接下来我们还是啊,这全局并行度是一,然后测试一下,看一看这个输出到底是什么样子。我把这个直接。Copy一下啊,接下来我们这个A啊,当前是result,呃,Overs result,做一个这个输出,然后同样上边把这个也定义一个,这个叫overseq result。把这两个表重新做一个输出,对吧,我们看看这一个over window的测试结果是什么样的。哎,大家想一下,当前我这个to a和to track有影响吗?其实大家会想到就是当前我做这样一个聚合操作的话,针对每一行选取,呃,这个前面的两行啊,一起做一个聚合,是不是只做一次啊,也不更改对吧?哎,所以大家看只要不更改的这种操作它都是可以的啊,所以我们这里边看一眼,诶大家看我就以这个CQ为例吧,大家看一眼啊CQ首先这个都是true对吧,这肯定是没毛病的啊,首先第一条数据哦,大家看这个三一这个数据来了之后,他直接现在你看到这就是按照顺序来的了。
17:29
因为我们本来不就是每一条数据单个都要聚合一次吗?啊,所以341你看到他的时间戳是诶果然43分19秒199吗?还记得我们那个时间戳吧,所以之前才是第一个窗口关闭是20秒嘛,200嘛啊所以这个大家就都一致了啊,然后后面这里边是有一个它的count数量一,然后后边是不是平均值啊啊,这个没没问题啊,六七十来了之后,当然也都是count是一,平均数都是自己,然后关键我们看下一条,一来的时候,下一条是二七,这是那个207对吧。
18:04
当前我们这里边是来了一条二零七三十六点三,大家看现在的count数是不是二啊,它跟之前的两条聚合,那只有两条,那当然就是就是二嘛,然后36.3和35.8求和,是不是三十三十六点五啊,所以呃,36.05啊,然后接下来再来第三条数据的时候,你看341现在是209来了,32.8又来了。大家看它现在是个数是三,后边聚合是34.9967对吧?啊,就聚合成出了这个结果,因为他要除以三嘛,最后肯定除不尽了,然后再来最后一条的时候,这里边341来了,这是212那条数据,大家看现在是不是还是三啊。他没有再再增长增长了,对吧,之前是123个数,到这儿是不是还是三,它选取的三条数据,就应该是哪三条做这个均值计算呢,是不是就是他们三条啊,37.1 32.8和36.3啊对吧,就没算上第一条35.8,哎,这就是这个over window的计算过程啊,我们做了一个简单的测试。
我来说两句