00:00
好,那接下来还有一个问题,在K。啊K之后呢,如果说我们做了开窗。啊嗯,那K呢,有可能也是数据倾斜嘛,由于这个数据倾斜导致的啊,然后呢,我们做开窗,那如果本身你的需求就是要做开窗,那这个时候呢,可以用两阶段聚合,其实刚才有同学提到了两阶段聚合,对吧,我问怎么办的时候,有同学想到了开窗,就是你要结合两阶段。聚合加开窗来做,那没必要对吧,对于我们本身不需要开窗的,没必要,但是如果说我们操作本身需要开窗,我就可以用两阶段聚合的方式。对吧,那为什么这个地方可以用两阶段聚合呢?为什么上面不能啊。为什么这个地方可以用2000算聚合呀?有没有同学说一说为什么开了窗就可以呢?
01:03
窗口就是批处理啊,对了,其实一个窗口我们只输出这么一次结果嘛,对吧,一个窗口我们只输出一次结果。对吧?啊,窗口只输出一次结果啊,而之前为什么不行呢?因为来一条数据输出一次,一来一条数据输出一次,而这个地方我们相当于攒一个批次来输出,对吧?输出一次而不输出多次,那之前的问题就没有了,第一个输据量会没有减少,那减少了对吧?一个窗口只输出一次,以前一个窗口里边十条数据输出十条,对吧?啊,这个地方呢,只输出一条,数据量减少了,第二由于数据量减少了,它就没有那个重复问题了,对吧,你十个。Hello啊呃,你只输出一次HELLO10,而不像之前来一条出一条,来一条出一条,它输出的是HELLO1到十,那这个数据就重复了,对吧?所以开窗是可以解决这个问题的,那接下来是开窗双重聚合怎么做呢?对吧?啊是这样子的,跟大家说一下啊来首先。
02:04
第一步第一是这个是原始数据A啊很多对吧,很多A好数据倾斜了,那接下来第一步呢,打散对吧,第一步叫打散,它随机数是A变成A1A2A3A4对吧?好接下来K本来是不是直接K败呀。哎,直接K是不是A都到一起了,对吧,现在呢,A打伞再做K半,然后呢这样。啊,那这边呢是A1,这边是A2 a3,这边是A4。这边是A4对吧,好,那接下来呢,聚合开窗聚合,这边开窗聚合,在每个并行度当中单独的聚合,它聚合的是A1的,它聚合A2 a3a4分别聚合的,对吧?先开窗聚合。开张聚合对吧?呃,开张假如说做sum啊,我就写写小一点了,要不然聚合写不下去啊做sum呃,那接下来呢,是不是我们要把这个分数干掉。
03:07
我们要把随机数干掉,然后呢,把当前这个窗口当中A把它聚合到一起啊,对吧,假如说你是1111啊,我就得到了一个A4,对吧,最终呢,得到了一个A4,四个A好,那这个数据呢,就还好了。对吧,好,那接下来有一个问题,什么问题呢?大家大家思考一下啊,大家思考一下啊,呃,这里呢,其实有一个问题,什么问题呢?你看啊,第二次我重新KB按照A吧,重新KB把随机数干掉,得到一个A4,这个没有问题,那有没有可能这个窗口呢,是零到五有四个A,或者说A5到十的窗口也有四个A。他是不是也做同样的事情,然后出去,那你想啊,这个四个A,如果说我们做任何处理,会不会跟这四个合并到一起,接下来输出数据就是A5A6A7A8对不对。
04:07
大家想一下。就是正常来说,既然我的要求啊,我的需求要做什么事啊,要做开窗,那你的结果就应该这个窗口是A4,这个窗口也是什么A4是不是应该是这样的结果吧,但是呢,你现在怎么样直接做累加变成了A5A6A7A8了,因为你后面做一个sum嘛,第二重聚合做一个sum,这个问题能不能明白,首先。当然我这个例子可能不好啊,有同学说关注到一个点,说你这个数据量没有减少,因为刚好四条数据,我拼接的四个K啊,所以一个K一个对吧,假如说我们这个是A12,我这样啊,A1A2 a1a2,那是不是这边是A2 a2这边处理两条数据变成A3对吧,知道一下这个事啊,那现在聊的是它对吧,这第一个窗口,一个窗口里边有aaaa对吧,出来的结果呢,是一个A字没有问题,那我们。
05:13
双重聚合开窗双重聚合对吧,它应该是属于零到五这个窗口的,好,那接下来五到十这个窗口也有四个A,理论上来说我们希望它变成A4。我们希望它是也是一个A4,它是五到十这个窗口A4对吧,但是由于我们第二次聚合的时候,我把随机数干掉了。我把随机数干掉了对吧?好这个地方呢,剩下A,那你把随机数干掉是不是也只剩下A,那你既然都是A,那我们fli当中,那做sum是不是它会把这个数据聚合到一起,所以第二个窗口出来的数据就是什么。这个五到十这个窗口出来的是几啊,是A42K8。
06:00
对不对,这个现象能不能明白。这个现象能不能明白?要思考一下啊。首先想一下这个现象能不能明白对吧。我可以把这个流程写清楚一点,对吧,第一个是。一次这个是五到十啊,因为这个是开窗操作了,所以我们要把时间写清楚,对吧,第二次呢是这个。零到五,零到五,这个是五到十对吧,这边呢有AAAA4个A啊,这边也有四个A,那我们要的结果是不是零到五除一个A4,五到十除一个A4,这个没问题吧,一步一步来啊。
07:03
这个事儿都理解不了吗?这一步能不能理解?我们是不是要求两个窗口各输出一个A4呀?这个没问题吧,好,那接下来我们看一下啊,首先第一步是不是打散打散我这样啊,为了不让它误解,我就不写四个了,我就写两个一。A2A12可以吧,好这样的话也能看到数据量小一点,好这个是打散,这是我们加的一步,对吧,双重聚合第一步打散,打散之后呢,这边做K。啊,本来四个A进一个冰毒,现在呢,变成al之后进两个病毒。对吧,这边有一个A啊,这边有个A1A对吧,好,这边呢,也有个A1。
08:00
啊A2啊,这个是A2好,那在各个病毒当中,是不是在各自的窗口里边各自计算的,那它算出来是不是得到了一个A12,它算出来是得到一个A22对不对。这一步一步一步来啊,有没有问题。这一步没有问题吧,啊,一步一步来,因为刚才整个聊完之后,大家没什么回应啊好呃,那接下来我们要做的事情是不是干掉这个叠基数。二重聚合呀,啊,因为你先聚合了一次,在窗口内部聚合了一次,对吧,接下来干掉随机数,第二次聚合干掉随机数之后,它就变成A2,这个也是A2,好,两个都是A,所以呢,发送到某一个边度,好这边呢变成一个A4,两个A2嘛,变成A4。对吧,好,那你看啊,这个密度当中处理的数据量是不是少了,本来是四条,我这个时候处理的是两条,对吧,因为窗口只输出一次结果。
09:07
啊,窗口呢,只输出一次,它不像之前A1来了A1A2来了就A2对吧?啊是这个好,这个是数据量小了,首先第一个问题啊,呃,能不能看出来他确实加了开窗之后解决了之前那种问题啊。就是开装之后,呃,不是KPI之后直接聚合,是不是解决了这个问题啊,数据量是不是少了,我处理的是不是两条数据链了,数据倾斜也解决了吧,四条变成两条,两条一处理。对吧,啊,那处理了两条数据量,数据量小了,最后结果也是对的,这个问题是不是搞定。这个问题有没有搞定啊?注意,这也是一个KPI操作啊。这个没问题吧。好,那接下来。
10:00
问题又来了,什么问题呢?我们看啊来这个地方它是不是也打伞A1第2A1第二个五到十这个窗口了啊好,它这一步呢,都一样的,这也是一个KPI操作,PI操作啊好,那这里边呢,也是分两个平度画的比较粗糙啊,这边呢也就最终得到了一个A12。A22对吧?好,但是这个时候这个数据跟这个数据不会混,因为这一步是开窗,那你是零到五的,我是五到十的,那肯定不会混到一起,所以我得到了一个A12 a22,好,接下来到这一步的时候,我是不是也要干掉随机数,重新K得到一个A,好,既然你是A,你是不是也发到这个平行度当中了,那最后呢,就变成什么了,A6A8。是不是合并到这个一起了,把多个窗口的数据合并到一起了,发现没。
11:01
对吧,因为第二次聚合的时候,我只有这个A啊,那A还分哪个窗口的嘛,不分了,是不是最后得到了A8,但实际上最早的时候我们说过,我希望得到的是第一个窗口是A4,第二个窗口A4,因为我本来就要做。开窗。对吧,所以应该是两个A4,但现在呢,第一次A4得到了,最后又变成A8了。这个问题现在有没有搞明白,就是问题的现象有没有搞明白。我一步一步说的啊。你想象一下这个数据的一个执行对吧。是不是?现在应该搞清楚了吧。对吧,好,那接下来一起来想这个问题应该怎么解决。嗯。
12:03
这个问题应该如何解决啊?他的问题是不是出在了将什么?多个窗口的数据放在一起了。那这个问题应该如何解决啊?不好想吗?哎,班长说了,K加窗口关闭时间。啊,就是第二次聚合的时候,我们是不是可以带上窗口信息进行聚合呀。对吧?啊,那我们要的是一个窗口里边相同的K放在一起啊,对了啊,就是问你引出就是这个点啊,所以我为什么要解释这么多,要不然光看这个地方大家看的更懵了,刚才我那样说了,我直接放在一块,你说都不知道对吧,所以呢,我拆开就说大家先理解了这个问题,然后接下来解决方案一出就很好理解了,要不然我直接说这个方式怎么做,你你不理解为什么呀,对吧,很多同学想不明白啊,那我们来看啊,第一次聚合的时候,B1种聚合,B拼接随机数。
13:22
拼接,随处进行KB开装聚合。对吧,好是这个好,那对,在我们获取数据的时候,它这个聚合之后一定要拿开窗的时间,至于拿window end还是start无所谓。随便拿一个啊,或者说哪两个也行啊,只要有一个窗口的标记就好了。对吧,好,那第二阶段主要去掉随机数。随机数去掉,然后按照原来的K加window and,或者说start,或者两个对吧,作为重新keep。这样就不会将多个窗口的数据是不是聚合在一起了。
14:05
OK吗?这个美女了,如果我直接带着大家看这个啊,大家都懵了,为什么要加这个窗口信息,我不加。也好好的嘛,对吧,诶开始给大家解释了一下,诶,如果你不加它,会将多个不同的窗口数据放在一起做聚合啊,所以我们一定要注意一下啊,在这个地方做双重聚合,假如开窗做双重聚合的时候,一定要带上窗口信息,OK吗?能不能行,现在。还不行吗?有ST t edit的感觉啊,差不多那种对吧?啊,一定要注意一下做这个事情对吧?要窗口的数据聚合在一起啊,那怎么聚合呢?就保留窗口信息,重新分组的时候要按照窗口信息也要带进去做分组才可以,这样就避免了将多个不同的窗口,虽然大家都是A,零到五跟五到十都是A,由于我带的窗口信息对吧,我是5A,你是10A啊,这个整体作为K,那你俩的数据会夹杂在一起了,你出来一个四,你也出来四,而不是最终合并为八,对吧?只按a k by的时候,那肯定出来的就是八,你是四,你是四,你不总共结果是八了嘛,对吧。
我来说两句