00:00
在之前我们给大家做测试的过程当中,大家发现啊,第一个窗口它的时间其实是二,呃,就是195~210对吧,第二个窗口我们说是呃,210~225嘛,所以这就说明我们输入第一个数据199之后啊,他给我们分配的这一套这个窗口机制,直接是按照这个窗口就直接这么分配了,195210后边跟着是210225对吧?诶,那大家可能就会有怀疑,这个你一开始区分的这个窗口起始点为什么是从195开始呢?啊,对吧,你为什么不能比方说我们想到你199输入的第一个数据吗?为什么不是199~214呢?或者说哎,我再调整一下,为什么不是190~2205呢?哎,这都是一个问题,所以这就涉及到一个flink底层到底是怎么样去给我们确定的分配这一组窗口的,因为大家想我们说这个窗口滚动窗口,滑动窗口对吧?呃,以滚动窗口为例,我们只有一个参参数,就是窗口长度,之前我们说了你这个窗口长度如果要是直接定在这里的话,那我并不知道这个窗口从什么时候开始啊。
01:16
之前其实我们讲这个窗口定义分配器的时候,给大家提了一句,就是当时如果我们调到底层,大家看到这里边啊,这个调用的时候呢,呃,方法里边是可以传两个参数的,对吧?那你这第一个参数是size,当前的窗口长度,第二个参数呢,就是一个offset,然后你如果不传的话,这个offet默认就是零,那这个含义是什么呢?哎,这这我们就知道,你比方说这里边你给一个这个整天对吧,整天或者整小时的这样一个滚动窗口的话,它默认当然就是按照整天整小时的给你算,对吧?啊,你整一个小时的滚动窗口,八点到9.1个,九点到10.1个,它不会默认给你设置出来是8.05~9.05,而你如果要真的想让它有这样一个特殊的设置的话,有一个偏移的话,那你要手动指定这个off set,对吧,默认这里是零嘛啊,所以一般情况我们不这么去设,一般是就是考虑这个时区的时候,可能才会设这个off set,这是之前。
02:16
给大家讲过的这个offset的设置啊,那这里边具体来讲的话,大家可能就又会有疑惑,那本身我们这里边这个起始点它又是怎么确定就是整小时呢?啊,那另外还有一个就是我这里面设的不是整小时一小时的窗口,对吧?我设置了15秒,15秒的窗口,它的起始点又应该是什么呢?这其实我们可以直接追到就是这个代码的底层里边去,大家来看一下,其实底层也非常简单,就是你追到当前我们这个窗口的这个as center里边来,然后呢,里边有一个方法,大家看到叫做assign Windows,这是window a center里边非常重要的一个方法,它就是在我们第一个数据来的时候啊,或者说是这个就是当前啊,你去确定,要确定当前所有窗口到底从哪个位置开始,到底长什么样的时候,就是调用到了这里面的assign Windows方法。
03:13
那这里面的aign Windows方法大家看一下它到底里边干了什么事呢?啊,当前我们这个是处理时间对吧?大家如果觉得处理时间有点别扭的话,我们还是看那个even time啊,Even time,然后even time这里,呃,其实处理时间更简单嘛,它你看到刚才它就是直接获取这个当前的系统时间了嘛,然后你看这里面一上来就是定义一个start,然后这个start等于什么呢?调用了一个time window下边的一个静态方法,对吧?大家看这个,这个静态方法里边传了三个三个参数,第一个参数是time step time step,那肯定就是当前传进来的了,对吧,大家知道这个。有一个element,有一个time STEM,这表示什么呢?这是不是就是我们诶有一个元素进来了,对吧?这个元素我们之前不是已经有了那个分配时间戳,提取时间戳的那套机制吗?我们说给它追加上这个时间戳,现在都把它提出来传到这个方法里边来啊,那当前的时间戳当然就是自己元素里边带着的那个时间戳了,然后后面还有一个offset,还有一个set,哎,那大家想这个size当然就是我们传进来的size了,Offset默认是不是就是零啊对吧?所以接下来我们看看这个方法到底干了件什么事啊,这里边一个静态方法对吧?这个静态方法我们看这三个参数传进来啊,Time step off set window set,然后在这里呢?
04:32
很简单的做了一个数学计算啊,这个计算公式大家看一下啊,一长串啊,有有点复杂啊,一一大堆啊,那这个干了一件什么事儿呢?整体来看的话,其实就是当前的time sammp,以当前这个数据的time STEM为基准,对吧?呃,大家可能会想到你,你输入第一条数据那个199,那是不是就是以它为基准的,确实是的啊,真的就是以它为基准的,然后接下来呢,后面还要减一堆,不是直接就把它当成start了,现在我们是要返回一个start嘛,不是以它为基准,而是什么呢?后面再减去一大坨,这一大坨是干了一件什么事,就是前面的一个一个东西要去百分号window s对当前的窗口长度取于。
05:17
然后我们看看这个取余的东西又是什么呢?诶这里边有一个减offset offset我们就先不管了,对吧,因为offset这里边默认是零嘛,我我们就先以这个零呃来看,那这一项就没了,对吧?那里边就剩下什么呢?当前的时间戳time stamp加上window size,加上长度,再对window size取余,诶那家想你加一个window size,再对window size取取余的话,大家想是取余数嘛,你加一个整个的这个长度,再再取余数,这整个的是不是就没有什么贡献,没有影响,对吧?因为大家知道你比方说我要对十取余,那你加十减十加20加30加它的整数倍啊,那最后你加的这一部分取余还是零嘛,所以这部分是不是也没影响啊啊所以啊,就是这里面为什么要加,主要是出于这个减了一个数之后,出于这个就是不要出现负数的那个考虑,对吧,主要是出于这个考虑,所以后面这两项我们现在就都可以不考虑了。
06:16
都直接给给它抹掉,所以最后我们真正要考虑的是什么呢?就是TIME3再减去什么呢?减去它对窗口长度取余之后的那个余数。那大家想想减掉之后剩下的是什么?减掉了余数,那剩下的不就是窗口长度的整数倍吗?哎,所以这就解决了,我们之前说为什么默认你创建一小时的滚动窗口,默认就是整小时呢?对吧?八点到九点,九点到十点,呃,而不是错错几分钟之后的那个状态呢?因为把余数零头都减掉了,都抹掉了,所以接下来剩下的当然你这里边是一小时,那我这里边要的就是一个整小时对吧?一小时的整数倍嘛,如果要是一天,我这里边就是整天数,那这里边如果说我们现在是一个15秒的窗口的话,那怎么办呢?当然就是15秒的整数倍了啊,对吧?啊,那所以大家算了啊,我们直接不用说15秒的整数倍了,我直接给大家开一个计算器,我们来算一下吧,就按照这个公式啊,我们老老实实的来算一下,现在我不用这个程序员,我们用那个科学计算器。
07:31
好,来看一下当前,诶我的这个时间戳,第一个时间戳大家还记得是199对吧?当然了,具体在做计算的时候,这里的时间戳应该是应该是后边有三个零,大家应该知道对吧?是那个具体我们做计算的时时候是毫秒数,但大家知道毫秒,你这是毫秒加三个零,这儿也是毫秒加三个零嘛,都加三个零,其实也没什么影响啊啊啊,这里边首先幺求九减offset,那大家知道减零对吧,我把这个流程还写出来啊,加Windows Windows我们当前设置的是15秒,那是不是15000啊对吧?这首先是里边这个括号算出来的东西,然后呢,取模百分号对吧?WINDOWS15000,然后大家得到看到是一个余数是一个4000。
08:24
如果是4000的话,那不就是四秒钟嘛,对吧,这剩下我们不用算了,就是接下来就是什么起始点就是199,这个秒数减去四秒钟,那不就是195吗?所以我们现在知道得到的第一个窗口star的起始点是195到。啊,那当然15秒钟后面怎么算,当然就是加15~210了,对吧?这就是我们得到的第一个窗口的长度啊,所以后面你看他得到这个窗口start之后,后面谬了一个time window time window里边参数是什么呢?它参数非常简单,就是一个start,一个end对吧,一个起始点,一个当前的这个结束点,所以这里面它传的就是start,然后start加上size,就直接这么创建出来就完事了,这就是怎么样去确定当前的这个窗口的起始点,相当于是用了一个整数倍对吧,当前窗口长度的整数倍。
我来说两句