00:00
我们现在已经了解了时间属性的定义方式,那在代码中定义出来呢,我们如果想要看到,只能是直接打印当前的表结构啊,做一个测试啊,看一看当前这个时间属性到底是长什么样子,那具体的应用当然还是要用在跟时间相关的一些处理操作里面啊,那最经典的时间相关的操作当然就是时间窗口了啊,所以一般情况我们所说的这个时间属性呢,都是跟窗口密不可分的。前面我们提到过啊,在flink当中提供了非常丰富的窗口计算操作啊,那可以说窗口的使用啊,也是flink进行流处理的一大特色。所以在table API和弗Li CQ当中,这一部分内容当然也是非常重要,也是必不可少的。那接下来我们就来介绍一下CQ当中的窗口实现,首先呢,我们要介绍的是flink01:12之前的老版本的窗口实现。
01:00
这种实现方式叫做分组窗口group window啊,那所有的这些常用的时间窗口呢,比如说滚动窗口,滑动窗口,会画窗口都有对应的实现啊,实现的过程当中,就是在CQ当中调一个函数,比如说滚动窗口就调一个tbo函数,那滑动窗口呢啊,它调的不是s slide,它调的叫hop hop,我们知道就是跳跃跳一下的意思啊,就代表了一个滑动窗口,另外还有就是session,这就是绘画窗口里边呢,主要存入的就是。这样的参数啊,首先要传入当前的时间属性字段,然后呢,呃,如果是滚动窗口,那就只传一个参数,传一个窗口大小,这个窗口的大小就是以一个时间间隔来定义的,就像前面我们指定那个watermark延迟时间一样啊,这里也是INTERVAL1HOUR,这就表示大小为一个小时的滚动窗口,那当然如果要是滑动窗口的话,可能还要多加一个时间参数,那就要表示当前的滑动的步长啊啊,那具体进行窗口计算的过程当中呢,它最大的特点就是对于窗口的这个定义必须要出现在。
02:10
Go by后边也就是必须要作为对数据进行分组的一个字段来进行使用,这也是为什么把这种老版本的实现啊叫做分组窗口啊,它就是当前数据进行分组的一个字段,所以我们看啊,这里写一句CQ select user啊,这是当前的用户,然后呢,后边这个呢,是可以调用跟窗口有关的一些函数,一些方法获取窗口里面的信息,比如说对于一个滚动窗口而言。本身的定义叫做tumbo这个函数,那么这个窗口的结束点怎么样去获取呢?可以调这样一个函数叫tumble and啊,那对应的如果要是起始点,当然就是他start啊,里边的属性呢,跟当时定义这个窗口的时候传入的是完全一样啊,当然了,一般这个不太好用,我们可以S把它做一个重命名啊。
03:00
然后接下来很重要的还有就是要做一个聚合操作,这个其实某种意义上就代表了我们在data vpi里边使用的那个窗口函数啊,就是当前我们按照窗口进行分组,你到底要干什么事情,做什么计算呢?提取这个字段当然不是特别的重要啊,最关键的那就是要针对数据分组之后要做聚合啊,那当然了,后边就必须要有一个当前分组的k group by,那首先基于用户user做了一个分组,另外分组的字段里边必须还有当前窗口的定义。啊,这就是我们当前针对每个用户一个小时内的所有数据做一个count统计得到的结果,类似于之前我们做的那个URL count table,啊,得到的就是一个urltable。那光分组窗口这种方式呢,看起来相对还算比较简单,但是它的功能非常的有限,它只支持窗口内做一些简单的聚合操作啊,就是这里边你调用一个系统内置的函数就可以做一些聚合操作了,更加复杂的功能它是不支持的啊,所以目前已经是处于一个弃用的状态,那现在01:13版本之后啊,新版本用什么样的窗口操作呢?那就是第二种,现在用的叫做窗口表值函数。
04:20
Window t VF啊,那link所使用的这个窗口表值函数啊,本质上来讲它是一种多态表函数,什么叫表函数呢?我们可以看成就是它是可以返回一个表的函数啊,就叫做表函数table方式,所以它的本质是把我们当前的。一张表要进行窗口操作的一个扩展,得到窗口相关的一些信息,然后把这个表里边扩展出更多的字段啊,然后接下来呢,就可以基于这张新的表去做更多的操作了。本质上来讲,这样一个窗口表值函数啊,使用的过程其实跟之前还是差不多的,现在呃弗link给我们提供的这样的几个窗口表值函数啊,滚动窗口啊,滑动窗口,这还是非常经典的啊,另外还有绘画窗口,这也是之前我们都已经提到的,还有一个比较有特色的新增的叫做累积窗口,这四种窗口表示函数都提供了对应的功能啊,当然了,现在这个绘画窗口啊session window目前还没有完全支持,还不是特别的完善啊,呃,也包括还有很多这个高级功能,因为像这个窗口表值函数呢,它因为是针对表的一个扩展嘛,所以它支持的操作就会特别的多,比如说我们可以基于这种表值函数去做一个窗口的套盆统计啊,或者去做一个窗口连接window draw啊,这些都可以去做,那只不过呢,现在这个窗口TVF的功能太多了,很多还不够完善,不过可以相信啊,在未来的flink版本当中,窗口TVF表值函。
05:55
就会越来越强大啊,以后我们进行窗口操作的唯一入口肯定就是这种方式,这是我们要掌握的重点。
06:04
啊,所以接下来我们就来详细的介绍一下这个窗口TF啊,到底是什么样子啊,到底怎么用,那对于这个窗口TF呢,我们说它是一个表函数嘛,就是相当于返回了一个扩展之后的表,那它到底把这张表里边扩出了哪些字段呢?呃,最简单的一个体现,其实就是它在原有表的所有列之外,还扩展出了三个用来描述窗口的列。啊,首先一个叫做窗口起始点啊,Windows start啊,这个非常好理解啊,你像之前我们要获取这个窗口的起始点结束点点的时候,还得去调用一个啊,类似于窗口定义的这样的一个函数啊,现在不用了,就直接多加了一个字段啊,多加了一个列就叫做window start啊,那当然了,有start就有end,所以还有一个叫做window and。另外一个呢,叫做窗口时间window time window time是什么意思呢?啊,它本质上指的是窗口当中的时间属性,它的值呢,就等于window n减一毫秒啊,所以我们发现这其实就是在之前我们看到源码底层所定义的一个窗口里边的max time step,也就是说窗口里面能够包含所有数据里边的最大时间戳。
07:21
那接下来我们看一看这个窗口表值函数在C组当中的定义啊,其实整体来讲跟之前的老版本的分组窗口差不多,都是调用一些固定的函数,首先我们看一下吧,就以这个滚动窗口为例,它调用的函数还是tbo啊,那只不过现在tbo呢,传入的参数比之前就多了一个,之前我们只需要传入当前的时间属性字段以及窗口的大小,一个interval啊时间字段,然后呢,现在还需要多传入一个表。因为我们说现在是表值函数嘛,它是把之前已有的这个表做了一个扩展啊,那所以呢,现在我们就是要把这个表作为参数传进来。
08:01
第一个参数就是当前的表,然后第二个参数,注意这个TS当前的时间属性字段前面要加一个script,用这个script把它包起来。然后最后还是当前滚动窗口的大小,INTERVAL11小时的滚动窗口。这个非常的好理解啊,呃,然后接下来就是滑动窗口了,滑动窗口跟之前也是类似,它是hope用这个函数去定义的,那里边呢,同样第一个参数是当前扩展的这张表,原始的表,然后接下来呢,呃,一个当前的时间属性字段,加上script ts,接下来就是当前窗口的基本参数了。我们知道滑动窗口一个参数是窗口的大小,另外还得有一个滑动的步长,这里需要注意的是两个时间参数,跟时间相关的参数。放在前面的这个,这个比较小,这是它的滑动不长,而最后放置的这个呢,才是它的窗口大小,所以我们现在定义的这就是一个窗口长度为一小时的滑动窗口,每隔五分钟滑动一次,这是滑动窗口的定义,Ho。
09:10
接下来我们要重点介绍的呢,就是现在新增的一个特色的窗口啊,叫做累积窗口啊,它的定义呢,这个函数叫做cuumulate cuumulate,就本身有累积的意思嘛,那为什么要新增这样一种特殊的窗口呢?啊,其实我们想到啊,滚动窗口和滑动窗口,一般情况我们都是对于一些指标统计的时候啊,就是周期性的指标,用滚动滑动窗口就特别的方便,比如说哎,我们统计这个一天的UV,一天的PV,那你就直接设置一个一天的滚动窗口不就可以了吗?那有时候呢,我们又是希望让这个输出的频率要高一点,诶,那这个时候我们就使用一个滑动窗口,哎,隔一段时间滑一次就会输出一次。但是我们会发现啊,嗯,这两种方式它解决不了一个问题,就是比方说我们现在呢,还是要统计PV或者UV这样的一个指标,我们就统计一天的,一天当中网站的PV数,如果说正常情况下,我们肯定就是开一个一天的滚动窗口吧,如果是这样去输出的话,那就输出间隔太长了,每次都是一天到头的时候啊,每天晚上的24点或者说零点的时候才会输出之前一天的所有统计结果。
10:24
这个频率太低啊,那如果说我们想要让它输出频次高一点呢,那使用滑动窗口的话,这个需求的含义就不一样了,因为我们想到啊,如果是滑动窗口的话,比方说我们每隔一小时滑动一次,那它的每次输出的其实就不是当天内的统计结果,而是过去24小时。之内的统计结果啊,就是第一个窗口有可能是零点到24点,第二个窗口就是一点到第二天的一点,好,那第三个窗口是两点到第二天的两点,这就不是一天之内的数据了,所以我们现在的需求呢,就变成了。
11:01
还是统计每一天之内的所有数据,24小时之内的数据,但是呢,输出频次高一点,比方说每隔一小时就输出一次,所以我现在输出的不是过去24小时之内的数据,而是只以今天为标准,今天零点开始之后,当天收集起来的数据。诶,这个需求之前如果我们用滚动和滑动窗口啊,其实是实现不了,但是在实际应用场景里面又很频繁啊,那针对这样的一个需求CQ啊01:13版本之后啊,就新增了这样一个累积窗口啊,其实使用这个窗口表值函数很容易实现这样的一个功能cuumulate啊,那所以现在这个cuumulate的做法其实就是,诶,我们看到啊,他收集的这个数据呢,相当于就是。窗口长度还是固定的,我们就是收集这么多长度,但是呢,每次收集的数据的这个数量可能是不太一样的,而且就是说比方说现在啊,我们这个类似的也有一个滑动的步长吧,每次挪的这个输出频率啊,那所以这个步长呢,每一次往前挪的时候,它。
12:11
窗口收集数据的范围其实是越来越大的。好像看起来是这个窗口长度在变一样啊,那这个变到一定程度呢,达到我们定义的那一个统计周期的时候,它就不再变了,接下来呢,哎,就直接进入到下一个周期去做进一步的统计了,这就是累积窗口的一个特点。所以如果说以刚才我们举的那个统计每一天的PV啊这样一个例子的话,那我们现在统计的就是从今天零点开始开始统计,然后呢,一点钟的时候诶,收集了多少数据,PV值输出一个,到两点的时候收集了多少数据,PV值再输出一个,所以我们会发现啊,这个数据是不断增长,不断变化的。一直到晚上24点的时候,输出的就是今天所有的PV啊,那如果再往后推推移的话,那就又开始下一个24小时的周期,统计的是第二天的数据了,之前的数据就已经没有关系了。
13:07
这就是累积窗口的具体的含义和用法,那它的定义呢?啊,这个定义我们看到跟前面我们讲到的滑动窗口基本上是一样的啊啊,只不过就是函数调用的是cuumulate,后面呢,参数先传入当前的表,要扩展的表,第二个参数是当前的时间属性字段script ts,然后后边跟的是两个时间参数,时间参数的话,诶,当然了,最后边的这个还是当前统计的周期,哎,注意这个统计周期就是你要统计一天之内的所有数据,那这就是一天。然后呢,前面的这个时间参数,那就是。更新的频率相当于输出的频率,我们这里面的专业的说法叫累积不长啊,就是到底隔多长时间累积一次,我们这里是一小时。这就是关于窗口的具体的定义,哎,那我们会发现啊,这里的这种函数的定义窗口的方式呢,它其实相当于data three API里边的窗口分配器,只是把窗口长什么样定义出来了,怎么样收集数据,怎么样去触发计算结果的这个时间点定义出来了,那具体我们到底要针对窗口里面的数据干什么事儿?
14:17
那还得定义一个窗口函数了,这个窗口函数在fli CQ当中呢?呃,其实我们看到前面这个分组窗口也能看得很明显啊,它其实就已经整合在了我们提取某一个统计输出字段的这个过程当中,直接调一个系统内置的聚合函数就可以了。所以呢,我们把这一部分放在下一节讲到聚合查询的时候,再去做一个详细的展开。
我来说两句