00:00
接下来我们再来介绍一下fli CQ当中的窗口聚合,在上一节当中,其实我们已经介绍了窗口到底怎么样去声明啊,那我们也介绍了,老版本里边是分组窗口group window,而且我们也已经知道怎么样使用window去做聚合操作了,那新版本呢,01:13的新版本给出的解决方案是使用窗口表值函数window TV,那么用这种方式我们已经知道它的声明呢,基本上差不多就是多传了一个当前的table对象,然后另外就是时间属性字段TS要在一个script里里面看起来只是稍微的复杂了一点,那它的使用过程是不是跟之前的。当前我们定义这个分组窗口时候的这种使用也一样呢,也是把它放在后边呢,很明显就不应该是这种调用方式了,所以接下来我们可以看一看窗口聚合窗口TF这种方式到底应该怎么样去。
01:02
使用啊,那这种方式我们看其实也是非常的明显啊。当前就不需要把窗口本身的定义再放在group by后面了。但是group by后面要的是什么呢?要还是需要当前窗口的信息的,我们必须把窗口的Windows start和window and作为当前group的一个字段跟在后面。但是我们知道本身当前的table啊,数据table里边或者说是click table里边并没有对应的这两个字段呀,诶没关系,现在我们有一个窗口表值函数,窗口表值函数不就是可以把当前的数据这张表扩充出跟窗口有关的相关相关字段吗?诶,所以当前我们做的是这样的一个操作。From table注意,这里面table其实是一个表函数的定义方式。里边就相当于要生成一个新的表了,而这个表呢,就是利用T函数,更让之前的table和我们相关的时间窗口的定义合在一起,全部传进去,就可以得到一个带着滚动时间窗口的一个新增相关列的这样的一个表。
02:23
啊,那所以接下来这个新的表里面就有了Windows start和WINDOW2个字段,我们可以把它作为分组的keep传入,那整体在外边s select的话,这个操作跟之前分组窗口其实是几乎完全一样的啊,我们也是想调什么样的聚合函数,直接在这儿调就可以了。我们看起来就是在窗口的应用过程当中,跟普通的分组聚合调用的聚合函数完全一致,我们不需要去区分到底是使用在什么场景,这样的话在应用的过程当中也就省去了很多不必要的麻烦。
03:01
所有的东西全部统一。当然了,我们也可以在前面把当前的window and或者Windows start提取出来,作为一个当前窗口的标志。我们可以在代码里边把。对应的这一部分代码还是做一个具体的实现,也做一个测试。那我们就还是接着之前的这个测试代码,直接在后边追加一些新的内容。接下来我们要做的是窗口聚合。当然了,这一部分聚合呢,我们区分不同的类型,窗口类型,我们都做一个简单的测试吧。首先。滚动窗口。前面的分组窗口,这个是老版本里的,所以我们就没有放在后边一起介绍。而是把它作为了分组聚合的一个特殊用法做了一个简单介绍啊,所以上面我们就不再去区分滚动滑动还有绘画不同的实现了,我们现在呢,可以直接来看一看窗口值函数T是怎么样去定义滚动窗口。
04:09
那同样这里我们可以直接使用table接去行一条,那里是select userme。我们就直接写在第一行吧。呃,另外还应该有一个COUNT1。是把as c个。这个前两个字段都已经有了。接下来我们要。换一行。看得更清楚一点,因为我们还需要有一个window。这个我们直接小写就可以as,呃,我们这个叫。And t。有了这三个字段的定义,接下来我们就可以from当前的表啊,那这个表就是click table了,我们要用表函数来做一个声明。
05:08
表函数table,然后加括号,这样的话,它这样一个函数得到的结果是一个新的表,哎,那当然了,在这个里边要传入的就是当前。我们的窗口TF窗口表示函数了。Humble。滚动窗口定义啊,那它里边呢,有三个参数,第一个参数。是一个table,就是当前我们基于的这张数据表。click第二个参数是时间属性字段,那是ET,注意还要包装在script里面做一个包装。ET。最后就是当前真正这个滚动窗口的核心参数。窗口长度十秒钟,我们把这个过来。
06:00
这样的话,当前的窗口就定义完毕了,而且这里边我们就相当于对于click table,它在原有字段的基础上扩展出了三个跟时间窗口相关的例,Windows start window和window。我们这里要用到的当然最主要就是Windows start和window了,它们就像之前分组窗口一样。必须有窗口的信息放在group by子句里面啊,那这里面我们除了username基本的这个分组的K之外,还应该要有window start window。当然了,他们顺序可以调换啊,也可以先window,然后window start。这样当前的CQ就写完了,就是使用。窗口表值函数去定义一个滚动窗口聚合十秒钟的滚动窗口聚合的过程。我们可以把这个定义成。Tumble window。
07:01
Result table。好,接下来我们可以跟之前的。使用老版本的分组窗口的这种方式聚合的结果做一个对比,看看两者是不是得到的结果完全一样。那我们知道,如果要是完全一样的话,直接调用to data stream应该是完全没有问题的啊。那方便起见,我们把上面的这些就全部住掉了,只看他们俩运行一下。我们可以看到,得到的结果果然完全是一致的,都是加I,都是插入的数据,而且统计每一个窗口内每一个用户对应的访问次数。这就是滚动窗口的用法,当然了,呃,其他的一些窗口的用法也非常的类似,我们可以快速的来做一个说明。比如3.2,我们可以说一下滑动窗口的用法。
08:02
简单来说的话,跟滚动窗口就可以说是几乎完全一样了啊,那直接copy一下。现在我们就不应该是tumble了,而ho或者是slide啊,滑动窗口的一个定义,前面我们都是username count1啊,然后另外还有window and as,呃,And t这几个字段定义都是一样的,后边呢,也是from table定义一个表函数,里边表值函数就不是tumble了,而是。好。然后里边呢,同样这个click,还有ET时间属性字段都一样,只不过除了当前。我们的窗口长度是十秒之外,可能还需要再追加一个滑动的步长啊,所以是前面要增加一个参数,比如说我们是隔五秒滑动一次。那相当于我们现在这个数据总共是从一到15秒都有数据的话,哎,我们现在定义了一个每隔五秒滑动一次的长度为十秒的滑动窗口,那其实应该是啊,每隔五秒就有一次输出,所以应该是五秒结束有一个窗口,十秒结束有一个窗口,15秒结束的还有一个窗口啊,那当然了,对应20秒结束。
09:22
还有一个窗口啊,因为我们知道十到20秒也是有数据的,另外25秒结束也应该有一个窗口啊,因为15~25秒应该至少还包含了报一个数据啊,所以对应的话应该是50 15 20 25应该有五个不同的窗口,对应所有用户统计次数的输出,我们看看最后运行的结果是不是符合这样的一个分析。啊,那可以把当前的这个滑动窗口,我们还是放在下边。
10:01
这里为了看得更加清晰,上面的这两行也全部掉。重新运行一下。我们可以看到确实输出是五秒结束有十秒,15秒,20秒,25秒啊,最后一个25秒也同样统计了一个数据,因为Bob在15秒点击的这一个数据,他应该可以划分到15~25秒这个窗口啊。因为当前刚好这个滑动步长和。滑动窗口长度的比值刚好是1:2,那所以同一个数据应该同时属于两个不同的窗口,这个是符合我们的预期的,而且当前所有窗口的输出,它也不涉及到任何的更新操作,直接使用to stream去进行一个的转换完全是没有问题,它是一个颈椎加流。这是关于滑动窗口的用法,那当然了,另外我们还有一个,这个可能更加重要一些,就是之前在stream API里边没有讲过的累积窗口。
11:11
我们看看它到底应该怎么使用,其实使用方式也是类似。我们可以看一下。当前这个应该叫umulate。然后里边的定义呢?啊,那同样也是前面都差不多,只是把这里边定义的这个窗口表值函数改成cuumulate就可以了。而且里边啊,同样我们有一个click table,另外呢,有当前的时间属性字段,同样也需要有两个时间间隔的参数,最后这个同样还是当前的窗口长度,这是我们所说的最大窗口长度,相当于是统计的周期,另外还应该有一个步长,这个步长呢是累积统计输出的步长,也就是每隔多长时间输出一次,当前十秒窗口里边已经有多少个了啊,所以这个结果就刚好可以跟之前的hop窗口的结果我们做一个简单的对照啊,那。
12:12
当前我们可以直接把这个做一个copy。Cuumul。Windowor table也放在这里。好,接下来我们重新运行一下,看一看。它和ho window滑动窗口的结果到底有什么区别?好,这里我们可以非常明确的看到,首先啊,一开始这个数据来了之后,Mary第一条数据,那显然这个都是MARY1没有问题,在五秒钟零到五秒的这个时间段内啊,Mary只有一条点击,然后Bob。这里我们看到BOB2条点击没有问题,爱丽丝一条点击这个都没有问题。
13:01
我们继续看后边零到十秒这个窗口,窗口的输出零到十秒,因为我们当前这个滑动窗口,哎,那它是从零到十秒,所有的数据都要统计,所以我们看到Bob。它是有六次点击全在里边了,而对于cuumulate累积窗口而言,我们知道零到十秒它的第二次输出。其实它的第一次输出呢,统计的也是零到五秒之内的所有数据,那第二次输出呢,统计的是零到十秒所有的数据,因为相当于我们是把零到五秒的数据先做一次统计,然后第二次统计零到十秒的数据,所以我们看刚好呢,滑动窗口它是。第一个是相当于是负五秒到五秒的滑动窗口嘛,哎,它统计的是之前这一部分,而之前零负五秒到五秒当然没有数据了,所以刚好就跟我们累积窗口的输出完全一样。
14:03
所以前两个时间段啊,零到。我们看到这个,呃,Umul window啊,它的零到五秒和零到十秒输出的结果跟滑动窗口的前两个窗口是一样的,关键看后边15秒结束的这个窗口。我们这里就看到了15秒结束的窗口,如果是滑动窗口的话,它是从五秒开始。到15秒结束,所以我们看到BOB1共有五条点击数据。而对应的cuumulate这样一个窗口呢,我们找Bob啊,Bob对应的cuumulate,结果它只有。一条点进数据,哎,为什么是这样一个结果呢?因为当前零到15秒这个时间范围内umulate window的话,当前统计的其实是十到15秒,那第二个累计窗口是从十到20秒的嘛。
15:03
而现在是十到20秒,窗口的第一次输出是在15秒的时候进行输出的,所以它相当于统计的只有十到15秒的数据,当前只有13秒这个数据啊,所以当前就只有一了。这样的话,累计窗口跟后边我们看到的这个滑动窗口的输出很显然就不同了,有所不同。同样后边如果说是这个20秒的输出的话,我们看到20秒的输出就可以做到完全一样了,为什么呢?因为20秒累计窗口输出的也是十到20秒这个时间范围内的所有Bob的点击次数。滑动窗口呢,当然也是十到20秒了,他俩就完全一致了。所以这里可以很明显的看到累积窗口和滑动窗口的不同。这就是关于。窗口聚合,不同类型窗口聚合的代码实现。
我来说两句