00:00
呃,大家会发现就是我们其实有一个问题,就是说到底我们这个数据来了之后,他的那个窗口一开始就是如果第一个窗口定了,后面时间就都定了,对不对,后面你就该滚动滚动,该滑动滑动,其实就是按照这个来标准走就行了,但是你第一个窗口到底是怎么定的呢?这是不是相当于是个问题啊,诶这个其实是大家非常值得思考的一个问题啊,这个我们到代码里面给大家看一眼啊。呃,这个在代码里面哪里去找这一部分呢?我们可以直接点进去,点到这个time window里面,大家看在这个里边,它其实是调用了一个Java stream下面的一个time window对吧?好,我们继续点,点到这大家就看到了,诶,它底层是不是就是window,然后传了我们那个signer啊,呃,大家还记得我们说那个type window本身是一个简写对吧?它本身底层的实现是不是还是点window,诶之前我们跟大家说过,它其实是点window里边是不是要传一个这样sliding even time window点到这样的一个。
01:09
窗口的那个signer对吧?啊,分配器,哎,所以大家看它是掉到这来了,我们这里边是even time,所以肯定是这里对不对?哎,所以大家看最后其实是用的这个类来实现我们这个窗口的,它继承了一个呃,实现了一个window s对吧?啊,这是这样的一个东西,那大家看它最初这个分配窗口到底是在哪分配的呢?往下边看,能看到它有一个方法叫做assign Windows对吧,大家可以看到,然后在下边就会干什么呢。就会算最近的一个start,这是不是就是当前窗口的那个初始点啊,啊,大家可以看到啊,然后这个初始点怎么算的呢?这个初始点有一个算法,调用了type window下面的get window start with offset这样一个算法,所以大家看这里边。
02:06
它怎么算出来的,就用这个公式算出来的,就在这儿呢。呃,那大家看一眼吧,他是还with offet对吧?那这个offet是什么呢?呃,这个offet其实我们这里都没有管它,大家看都根本没有传对吧。所以我们这里面没有传offet的话,它的off set就是0OFF set本身它是用来干什么的呢?它其实用来是指定我们那个时间的时区的,因为大家想我们所谓的这个时间戳,它都是我们说从那个呃,1970年1月1号对吧?呃00:00开始计数的一个毫秒数啊,但是你这个1970年1月1号到底是到底是北京时间还是纽约时间,还是伦敦时间。呃,这个就有区别了,对不对啊,当然正常情况下默认肯定就是呃,这个标准时间就格林尼日时间对吧,就是临临时区的那个那个时间,所以那如果我们要是北京时间呢?对,北京时间其实我们是东八区对吧,我们的时间应该比他要是不是应该比他的时间要早八个小时啊,所以大家会想到,如果我们这边的时间要跟呃,当然我们自己平常做计算就无所谓了,对吧,你你这个都知道,就是在国内嘛,如果说我们要跟他们就是标准的时间要统一的话,大家想这个offset应该是加还是减偏移。
03:36
对,我们这里应该要把我们的东八区时间要统一回归到这个,就是跟他们一样的时间,对不对,哎,所以这个时候其实是要减八个小时啊,所以如果要是东八区的话,那就是你传的时候传一个offset负八对吧,负八小时呃这样的啊呃,这里既然提到了这一句,跟大家说一下,我们前面在做这个操作的时候,那这个offet怎么传呢?我们这里是一个划窗啊,划窗它没有没有没有没有那个方法啊,这个我们得,呃就就这样啊,我还是在这儿重新写一个吧,我们把它用上面写一个啊window,如果我们这里边去实现一个event time。
04:24
呃,这个a sliding even time Windows,然后它可以点of,大家可以看到它里边传的这个参数就可以是time点,呃,比方说我们这个SECOND15,然后这是size对吧,后面是不是可以传一个slide sentence5秒。诶,然后大家可以看到我后边是不是还可以再传一个,比方说我传一个hours负八,大家看是不是可以这么去调用啊,这个传进去的第三个参数是什么呢。
05:02
第三个参数就是我们这里的offset对吧?啊,就是我们这里边的那个偏移量,就是用时区,用这个偏移量来表示这个时区的好,这个就是给大家大概既然提到了,就给大家多说一句啊,这里边住了啊,然后这里边呃,前面我们给大家是说到就是这个offset,我们这里就是零,我们没传那就是零了,对不对?呃,那大家看按照这个公式啊,这个算下来应该是什么,我们算一下。把刚才那个做一个计算。我们刚才那个是多少来着,那个那个时间戳这个啊,你你不能直接用199对吧,时间戳得用它才完整的那个,所以大家看它这个是怎么算的呢?啊,其实就是两部分,大家看好像是一大坨对吧,但其实就两部分,就是本身的这个时间戳,再减去一堆东西去对window size去磨对吧?诶所以大家会想到再看这里边outside就是零,那这个我们直接不管了,然后这里边就是时间戳再加上一个window size,再对window size取模,那大家想加一个Windows对它取模,这个有影响吗?因为大家知道取模吧,其实是那个除了之后取余数对不对,它自己除自己是不是肯定余数是零啊。
06:28
啊,这个大家知道对吧,所以那我们这里面是不是加不加其实没关系啊,所以我们甚至可以直接简化成就直接用它去对它取模是不是就可以了,哎,所以大家看一眼啊。诶,这里边其实,呃,我我还是找个这个计算器吧。好,我把这个。曲模它要对多少曲模呢?大家会看到window size我们现在是15对吧?哎,所以哎,大家会想到这里边如果windowize是15的话,大家会想到你前段时间戳应该是一个那个毫秒数是000啊。
07:08
那15秒是不是后面也应该000啊,这个取余是不是最后效果一样,呃,都加三个零,都是少三个零一样对吧?所以我们就不加了啊呃,那大家直接按公式的话,那我们加上15,其实也一样,加15,然后再磨15对吧,大家看到磨出来是一个四。所以然后接下来用这个time step是不是那个199啊,199减去四是不是变成195了,所以大家会看到这里边是不是本身算出来它的那个。最初的第一个latest的那个window是不是就应该是195打头多少结束,是不是210结束啊,对吧,所以算出来就是这样的一个状态啊,那当然大家就会又有疑问了,哎,那你我们现在这不是划窗吗?划窗怎么。
08:07
我我们当时明明华冲第一个是到到200的时候就已经关了呀,哎,那大家就继续回过头来到。前面它调用的这个,呃,不是那个给关掉了,还是到调用的这个地方来继续来看它这里边是不是先算了一个last start,最最近的一次那个起点对不对,大家看接下来他干什么事了,是不是一个for循环,然后。它是追加了好几个window啊,对吧,它这个过程当中是怎么算的呢?Start最先就是我们的那个一开始是多少,一开始是不是这是195啊,我们就直接写195了啊,因为这不涉及后面那个取域,就是加加减减,那就没事,对吧,195开始,然后他判断什么呢?如果这个start大于time减size的话。
09:01
Time减size是多少?我们现在time step是。199对吧,Size是15,一减是不是184啊对,如果它大于它没问题对吧?那么就把这个窗口按照当前的这个195,是不是先加上一个窗口啊,这个窗口就来了,所以这是195开始的一个窗口,210结束对不对,然后接下来没完继续,如果要,呃,就是完了之后是不是start要减去一个步长啊,滑动不长啊,减去之后是不是下一个start就变成了190啊,190再判断一下是不是大于184呢?诶大于184,所以是不是照样190开始的这个窗口也要创建出来啊,大家看是不是这样。这就是190~205对吧,然后继续再减,是不是变成了185 185是不是还大于184,所以是不是再创建一个窗口啊。
10:11
所以最后创建出来是不是这样的三个窗口。那185这个窗口是不是它200的时候就应该结束了,所以最早关闭的窗口是不是200啊,哎,所以大家看就是这么来的。那滚动窗口里边是不是就没没这一说了,呃,大家可以看一眼啊,呃,这里大家需要注意的是,其实刚才我们算的不对啊。刚才算的不对,为什么呢?因为滑动窗口这里边get这个方法,大家看最后一个参数传的是什么,传的是slide,就尽管这里边叫Windows,但是传进来的其实是slide,对吧。大家看是不是这样,它其实是传进来的,是滑动步长,所以这里边我们算的时候应该是怎么算呢?应该是这个是不是要加上一个slide,然后再磨一个slide呀。
11:05
一样对吧,是不是算出来一样还是四啊啊,所以最后算下来结果都一样对吧?啊,这个刚才这一点还是给大家说一句啊,实际上这里传的是slide。然后接下来给大家说一下,就是那实际的那个滚动窗口到底又是怎么实现的呢?这是滚动窗口对吧,这个点进来之后大家看到是不是tumling even time window啊好点进来我们看一看它这里是不是直接就诶这里是size了,对吧,它就本身没有补偿吗?这个直接传进去是不是直接拿到这个start直接就创建出来了呀。所以我们拿到的是195,它是不是只有一个195打头的啊,所以就是195开始210结束,对吧?大家回忆一下,当时我们测试是不是这样,滚动窗口是不是210结束了,滑动窗口是不是200就第一个结束了,哎,这就是这个过程啊,大家把这个再看一看,再就是梳理梳理啊,这个涉及到它里边的一些细节,一些这个实现的一些小细节啊。
我来说两句