00:00
好,我们已经知道在table API里边group window怎么去用了,那另外还有一大类就是over window,那over window其实大家应该也并不是特别陌生啊,就over window其实本身是标准CQ里边就有的一个子句,就有这样的over子句对吧,就。结合上下的这一段数据去做开窗啊,那像这个其他的一些组件里边,像大家熟悉的have里边也有这样的开窗函数,所以这里边的定义其实是非常的类似的啊,那它的效果就是我们可以呃,在这个查询的select子句里边定义这样一个窗口,定义一个over window,然后接下来呢,诶,我们查询出来的结果就可以基于这个window去做一些聚合,得到对应的那个结果输出。啊,那所以这里边我们的这个over window的聚合呢,它的特点跟前面我们讲的分组窗口不一样的,就是说之前我们那个是要聚合,聚合当前窗口内很多行的数据,得到一个结果,对吧?啊,大家可以认为那个是多对一的一个一个状态,而现在的这个over window呢?啊,它其实是一对一的一个状态,它是怎么样呢?只针对当前每一个输入行,然后它是要当然最后我们还是要聚合多条数据嘛,它是针对每一个当前行。
01:19
结合它的前后相邻的范围内的一些数据,然后做一个聚合。啊,所以最后是每一行对应的都有一个聚合结果,每一行都有一个聚合结果,对吧,就看起来跟我们呃,之前讲的那个来一条数据聚合一次,来一条数据聚合一次好像更接近一点啊,所以说它本身是这个CQ里边就是自带的一个本身就自带的一种窗口的一个定义形式啊,啊那我们在代码里边如果要去做操作做定义的话,哎,这里边是呃,要用这个也是直接点window。做一个窗口操作,那里边要传的呢,就不是group group window了,对吧,里边要传的就是一个over window,同样这个类呢,也是table API里边给我们已经完全定义好了的,那这个用法大家看到就会稍微的简单一些,因为不涉及到之前那个按照窗口分组了嘛,不涉及到这个group by了,所以大家看它的用法就是直接点window,然后呢,定义一个over window,注意后面也要给别名asw,哎,为什么呢?呃,这是因为后边你如果要去做那个聚合的时候呢,必须得定义出来over那个window对吧,因为大家知道就是对于这个over子句啊,你定义了一个这个over window之后,我们一个select去做。
02:39
查询去做这个字段的聚合选提取的时候,它必须都是基于同一个over window的,对吧?啊是要是要把这个都要定义出来的,所以这里边大家看后面sla的时候怎么样定义呢?A啊这比方说这是可能是我们的一个K对吧,然后这里边呢,哎b.sum诶这是一个聚合B这个字段的一个求和,然后overw。
03:03
然后C呢,可以取同时取最小值c.m ow啊。啊,这样的话就定义了一个基于over window的一个聚合操作。那大家可能会想到,诶,那这龙吟斗里边难道没有K的定义吗?啊,其实也是可以有的,因为大家熟悉这个,呃,Over window的这个语法形式的话,其实大家知道啊,里边我可以那个partition by,对吧,可以定义它分组的那个kid啊,只不过是一般情况我们叫做分区的那个K啊,这里边的定义也是一样,我们来看一看table API提供的这个over类来来怎么样,到底来怎么样用,对吧,就是这个over window到底怎么来定义。之前我们那个呃,Group window它不是有不同的类型吗?对吧,那个group window定义的时候就是直接T,呃,Tumble,呃,那个on什么对吧,Over什么,然后on什么,然后那个呃滚动窗口,滑动窗口的话,Slide over什么slide那个every什么on什么对吧?这里边这个当前的这个类呢?啊,它就叫over,就这么一个类就叫over。
04:09
好,那接下来我们看一看这个over类到底怎么写啊,这里边就又分了两大类的定义,一类是无界的over窗口,另外一类呢是有界的over窗口,那这个说的是什么?这个主要是说。就是我们定义的这个它前后的这个数据嘛,那这这就涉及到一个问题,就是你到底定义。多少范围内对吧?啊,那正常来讲的话,我们肯定是要定义一个界限,比方说我之前十分钟之内的数据啊,或者说我之前这个十个数据,对吧,按照个数来定义,这都是大家容易想到的,就类似于时间窗口和技术窗口啊,只不过是基于当前这个数据而言的,那这里边还有一种定义呢,那我不给这个定义行不行?诶,可以啊,那就是相当于变成了一个无界的,无界的话,相当于是默认就要从。
05:02
就是从头开始对吧,我当前不是动态表吗?那就从最初的一条数据开始,一直一直截止到哪里呢?截止到当前数据就是current这条数据啊,这就是所谓的无界over window啊,那这里面要给大家说一句,就是呃,如果大家在那个就是一个真正的一个CQ里面去写的时候,可能知道他这个上下界啊这个界限。就是我可以定义它之前从哪里开始,就是比方说我这里边不是一组数嘛,对吧?呃,这里面大家因为想到我们这里是硫嘛,所以是一组我们的一行数据,其实在这里是一条一条数据对吧,一个一个数据来的,然后我可以定义什么呢?哎,我当前这一行数据,它之前的两个和之后的两个,我可以定义这样一个范围,对吧?或者之前两分钟和之后两分钟,正常来讲的话,我们在那个CQ里边可以定义前后进。
06:01
但是现在呢,呃,现在不行,至少现在还不支持啊,在这个table API那个CQ里边,因为大家知道它是来一个处理一个流处理,我这个数据来的时候,我能知道他之前有多少个,知道之前两分钟之内有多少数据,我能知道之后有多少个吗?那肯定不知道啊。之前我们的CQ里边能够实现这个上下界同时都能实现,那是因为数据都到齐了呀,对吧,所以当前我们这个是来一个处理一个,那当然就是只能最多截止到自己为止。所以大家注意啊,就是现在它还现在这一个table apio window的定义呢,还不支持定义它的这个下界,也就是所谓的这个following啊,所以大家看一下这个具体的语法啊,我们这里边的这个语法其实就是一个over。这个类啊,还是我们用空格这个方式表示它后面的这个调用这个就语法更加明确一些,Over窗口怎么样呢?可以protectition by对吧?基于某个字段之前我们这个不是最后提取出来有个A吗?看起来这个像ID对吧?所以我们里边去做这个,呃,统计的时候呢,也是根据这个A来做,就是根据这个当前的kidd啊来做统计的。
07:16
分组统计的,那这里边我就可以protected by protect by a。然后后边呢,哎,还要有一个排列顺序对吧?呃,有有可能我数据是乱序的呀,所以这里边order by,比方说是基于这个事件时间,那我们order by RO泰。那如果要是呃后面定义上下界啊,上下界大家看到是preding,这是上界之前的嘛,呃,然后那个下界的,或者说这个应该叫下界对吧,按照那个呃字段的我们那个时间字段的大小来讲,这个应该叫下界啊,我们应该说这个就是前界吧,对吧,之前到底到多少,那之后那应该那个字段是following,现在那个following基本上没什么用,因为它基本上就是你如果要是特别定义这个截止到多少的话,当然也是可以的,但一般情况是结合呃到当前为止嘛,啊,所以说这个following是没什么意义的,那这里边一般就是定义pre pre。
08:12
那如果要是无界的话,这里边给的啊,这里边如果是时间,大家看基于这个时间的话,给的就是一个unbounded的range啊,这就是这个一个常量啊,把这个指定,这就是从头到尾所有的基于RO排序,哎,在当前这个数据之前,所有的都把它聚合起来统计。那同样就还有这个,呃,处理时间对吧,只要改一下这个时间字段就可以了啊,另外还可以怎么样呢?还可以定义这个计数的这个聚合,那可以怎么样呢?呃,那这里边定义的就不叫unboy的range了,就是unboed的肉对吧?啊,就是所有的在当前这个排排列啊,当前数据之前所有的行都把它统计出来,所以大家看,如果对于这个无界窗口而言。你其实这个这个基于时间和基于这个肉啊,基于行数,其实没什么区别是吧,都是之前所有的,它关键是你按照什么来排,这里边的这个时间字段比较重要。
09:09
啊,这是这一部分,而且就是这个proceeding,其实这个可以可以省略啊,你省略掉的话,默认就是从头到尾所有的无界的。啊,这是这个over window,无界over window的一个定义,那有无界就有有界呀,哎,我们看一下这个有界怎么定义呢?啊,这个其实也很简单,这就是前面还是啊over,然后position by啊做这个K的这个分组分区,然后呢,Order by一个时间字段后面,诶如果说我要是基于有借的时间的话,那我就PREDING1分钟。啊,所以这个就相当于什么,以当前数据为准,统计它一分钟之前所有数据,然后大家聚合出来一个结果对吧,然后as这个W。啊,然后下边如果要是说你这个事件处理时间的话,还是改一下时间字段就可以,另外如果要是基于那个行数来统计这个有界的over window的话,那这里边P就变成了,比方说之前的十行,那就是十点Rose啊,跟我们之前那个呃,时间窗口技术窗口的那个定义非常的类似。
10:16
大家就把这个也要稍微的熟悉一下啊,知道这个东西怎么用就可以了。好,那这一部分我们先在理论里边大概的做了一个了解,那接下来给大家还是快速的在代码里边做一个简单实现啊,大家看看这个过程到底怎么该调用。好,呃,这个我们接下来讲这个over window聚合操作,聚合操作啊好,然后接下来大家会想到这个过程当中,其实重点还是需要把这个呃,Over window创建出来,只要创建出来之后,那后边那个select,或者说呃,其他的这些操作,那就很简单了,对吧?啊,所以这里边我们还是啊定义一个,呃,这个叫overs result。
11:05
Table啊,同样还是一个table table啊。基于之前的sensor table,然后接下来,诶,我们这里还是直接点window对吧,这里边我们要定义的是一个over window,所以传一个over。这个要引入对应的类。啊,我们知道后边首先可以position by嘛,而且现在我们确实是要按照那个ID要做一个分组的,对吧,呃,你既然是这个统计它这个上下几条几条数据,呃之内的这个比方说我们还是统计这个count值吧,对吧,每一个温这个传感器的温度来了来了几个啊统计这个count值,那我接下来就是要这个by ID。字段给定,然后后边呢,还有order by对吧,Order by order by时间字段TS,我现在事件时间啊,这个处理时间也是一样的啊,然后preding,如果要是无界的话,你可以不给啊,有借的话,那我就定义出来,比方说我现在是有界的,按照行数来有借啊,我给一个两行to Rose,大家看可以这个Rose对吧,把这个定义出来,然后最后as,我定义一个ow,对吧。
12:15
当前的这个叫做啊。哎,那接下来大家看到这里得到的是一个over window的table,那我们再看看这个类型啊,这个类型里边这个接口里边就只有一个select方法,那所以别的都都不用去麻烦了,对吧?啊,你就调select就完事了,得到的就变成了诶。这里边我一不小心给关掉了啊,我们重新起一下。好,我们回来继续看到这一部分,大家看到这个select之后得到的其实就是一个table类型对吧?啊,所以呃,通过这个select调用这其实代码里边真的是非常简单啊,就这么几行,三行代码直接搞定啊,所以说使用其实真的是没有任何的难度,大家关键还是要就是就是理解清楚它这个底层的含义到底是什么啊,那后面这个用的时候忘记的话,你过来查一下就知道了嘛。
13:09
啊,所以当前我们这个如果要是select的话,Select什么呢?呃,当前是ID对吧。ID,呃,然后我们还希望有什么呢?呃,比方说当前时间戳我输出一下对吧,看看到底是什么时间的这个数据,然后后边呢,要count一下,比方说这个当前id.count调用统计当前这个呃,开窗之后啊,到底有几几条数据,这里边大家注意啊,Count还必须得有一个over对吧,因为你如果直接调这个count的话,那它默认它是应该你有那个分组,然后去做聚合的,这里边你如果要是这个over window的操作的话,必须得有over over这个ow,对吧。啊,那后边比方说我们还可以算一个,比方说temperature啊,温度值它的比方说我们直接算平均数,大家知道之前我们那个呃,CQ里边方法有这个avg嘛,求平均值over o对吧,这样的话就可以得到想要的一些结果。
14:08
好,那这里边我们把上面这个注掉,然后把这个打印输出一下啊,当前这个叫overs result table,同样,诶,我们这里就给大家示范一下这个to a PA stream,因为大家知道这个是每一行有一个输出结果,其实就是往后追加的,它并不会更新对吧?哎,所以这里边我们直接to aend啊。一个肉,然后print。这个我们叫overs result。好,接下来我们来运行一下这个代码,看看效果怎么样。嗯,现在嗯,好。现在已经执行结果输出了,我们看一下这个结果是不是符合预期,哎,这里边得到的,哎这样六条数据啊,为什么是六条数据呢?哎,因为之前我们不就一共是这个六条数据吗?输入就六条数据,然后这里边输出六条数据,呃,非常合理对吧?因为我们说的就是每来一条数据之后,它都要应用这个开窗函数得到一个自己的结果嘛,啊所以我们现在看我们取出来的是ID,还有当前的那个时间对吧?诶大家看是40分三分19秒199嘛,对吧,43分19秒这个数据啊,然后呢,统计的那个,呃,它的count温度的count数量和温度的平均值对吧?当前窗口内的平均值,那大家看到现在只有一个,然后35.8啊,这是我们说我们要PREDING2嘛,所以是自己跟之前两行的数据,当前窗口内是就是自己跟之前两行数据合起来一个over window,然后我们做了这个聚合,那它之前没数据啊,对吧,我们按照。
15:48
他这个这个时间去排序的话,这个之前没数据,所以这里边就只有一个数据,平均数35.8就自己,然后在同样后面六七十这三个是不是都一样啊,对吧?啊,他们这个都是一个数据,然后就是自己,然后关键我们看后面这个一啊。
16:05
一这个又来了一个207时候的数据是27秒啊,然后37.9啊,所以这里边如果说我们这个运行一下的话,大家会发现他统计自己的时候还连上了上一条数据,对吧,199这条数据他并没有管时间隔多少,我们只要他的这个之前的两条数据,所以接下来再来一条数据的时候呢,32.4,哎,他同样把前面统计两条嘛,啊,所以之前输入的两条都有。这变成了三,然后这里边大家看这个,因为多了一个比较小的数据,这个平均值就拉低了,对吧,变成35点几了。啊,大家如果要是还想看的话,我甚至还可以把这个。再输入一条对吧,比方说我这个再再给一个大点的,给一个39啊,对吧,后面我这个209的时候,输入这条数据,我们再重新运行一下。啊,这个不用编译的话,可能运行会比较快啊,大家看一下这个整个的这个输出的结果是不是符合预期,我们要的是当前数据和之前两条数据,那应该是最多统计三个对吧,你不能超过三个,那现在这341已经有四个了,我们看看它最后这个输出的样子是什么样的啊。
17:20
好这个诶最后输出结果了,前面都一样,这个就不用说了啊,这里边是二,这里是三个,哎之前的两条嘛,大家看最后一条数据统计的也是三个对吧,那这三个到底是哪三个呢?诶当然应该就是大家看是37,三十二三十九对吧。他们三个平均数大概是36点几啊,当然这个可能跟这个也差不了太多,大家可以算一下啊,算出来应该就是他们三个加起来的一个平均数。啊,这就是这个over window的用法。
我来说两句