00:00
在咱们之前的讲解当中啊,我们说了reduce by key啊,它可以做我们的word count啊,然后呢,做我们的这个分组聚合,但是呀,这种所谓的聚合呀,有一个这样的效果,大家看一下来,咱们回头看我们之前画的图,咱们的蕊就是beck key呀,他会在我们的杀uff否之前的分区之内,先做相同K的value的聚合,对不对?然后呢,在我们否之后,它会对我们的这个K相同的K的value做聚合,对不对?所以啊,记住这个数据它来自于两个不同的分区,那我们就称之为叫分区间啊,还有个叫分区内,所以啊,这里我们还得再提到一些概念,比方说我们说一下啊,咱们叫分区内,然后呢,还有一个我们叫分区间啊,大家看一下有这么一个概念,嗯。那么我们这个啊,它就属于同一个分区之内的数据在做一个聚合,这是我们所谓的预聚合功能,但是你落盘之后,那就是多个分区之间他们来做聚合了,所以这叫分区间,那么就意味着我们的蕊就是key,它的分区内和分区间,它的聚合规则它是要完全相同的,就是你分区内是相同的t value622聚合,那么你分区间也应该是我们的相同的T的数据两两聚合,对不对?所以啊,我们说了,咱们再去解释一下来,嗯,把这个概念咱们先放到这边,然后呢,我们再来补充一下,就是我们的reduce by key reduce by key,它的这个分区内啊,咱们叫分区内和分区间啊,咱们的计算规则啊,计算规则它是相同的啊,它是相同的,诶就是这个意思,嗯。
01:46
啊,所以啊,这个呢,我相信也没有什么太大问题,对不对,可是在某些情况下,我们做的业务当中啊,我们的分区内和分区间的计算规则它可能不相同,比方说咱们之前好像做了这么一个功能,就是分区内求最大值,分区间求和。
02:06
大家还有印象吗?咱们在之前咱们做了这样的一个功能,先从分区内把最大值拿到,再把分区间的数据给它求一个和啊,咱们当时是举了一个例子啊,比方说我们的1234,大家还有印象吗?然后呢,我们分两个区,你如果分两个区的话,一和二对不对,然后呢,三和四,那么这个时候呢,我们的每个分区的最大值是二,然后呢,这个是我们的四对不对,然后最后我们这边是个六,这个咱们之前讲过吧,同学们最后的结果是不是六啊,这个时候你就会发现我们的分区内它的计算规则呢,是求它的大的值,而我们分区间它是求和,那这时规则不一样的话,你拿咱们这个reduce by key可能就做不到了。对不对,因为我们的reduce back,它要求分区内和分区间计算规则相同啊,那这个时候如果你做不到,你该怎么办,对不对,所以啊,咱们Spark又提供了下面的一个我们的方法,这个方法呢,我们叫做aggregate by key,这个aggregate就是聚合的意思啊,就是相同的T做聚合。
03:18
但是这个聚合呢,它就告诉你了,我们的分区内和分区间,它是可以独立开的,他们的规则可以分别设定好,那我们这里呢,一块儿来看一看,把这个呢,我们拷贝啊,咱们写上一个时期,嗯。然后呢,我们来点击OK啊放过来,放过来以后呢,把这个呢,我们就去掉,哎,咱们不要了,呃,然后呢,我现在咱们想想咱们怎么做呢,咱们这样啊,还是按照这个思路来走啊,给他一个我们的二吧,两个我们的什么,两个我们的分区,然后呢,我这么写啊,咱们这么写,现在两个分区的话,大家想一想,那么是不是它和它在一个里面,它和它一个在一个里面嘛,对不对,那么我们说过了,分区内相同的K,它取那个大的值,然后呢,分区间让相同的K22求和,那么这个思路上就是这样的,咱们看首先第一个相同的那个我们的K是不是A呀,哎,A啊是我们的A,然后呢,它的那个一和那个二是不是在一块儿。
04:21
那么好,那么我们另外一个呢,是A,大家想想是应该是个A,然后呢,它这个里面应该是我们的三和四吧,没问题吧,同学们,那么这个时候我说了,咱们要想办法相同的这个A里面把那个二给它取出来,同样道理,在这里呢,A我们再把那个四取出来,那我最后不就形成了A逗号六吗?所以这个A逗号六是我们最终想要的结果,那好了,那我现在呢,就试一试,咱们叫RDD点我们叫什么呢?叫aggregate,咱们的这个by key啊,就是它。那这个aggregate by key啊,咱们可以提示一下啊,CTRLP啊,咱们快捷键CTRLP来提示一下参数,这个参数当中大家会发现咱们最上面这个地方呢,有一个隐食参数不说了,然后呢,最前面呢,有一个叫函数的颗粒化,它会有两个参数列表,而且没有默认值,所以啊,咱们这不说别的,先给他两个参数列表对不对,所以咱们写上一下啊,咱们在这写上一下,嗯,咱们叫aggregate by key啊来,它存在咱们叫函数的颗粒化,哎,就是这样,那么它有两个参数列表啊,颗粒化,嗯。
05:38
它有啊,我们的两个参数列表,那么第一个参数列表啊,第一个参数列表什么意思?咱们先不说,咱们先来看第二个啊,咱们叫第二个参数列表,第二个参数列表咱们在这儿啊,咱们提示一下,提示以后大家看一下,第二个参数列表中有两个函数作为参数传进来,所以啊,我们说一下第二个参数列表它有我们说啊,需要咱们叫传递两个参数,那么你需要传递两个参数的话,第一个我们的参数它表示什么呢?表示分区内它的计算规则。
06:18
诶好,再来说一下,我们叫做第二个参数,它表示分区间啊,它的计算规则。所以啊,两两两两计算,两两计算的话,那么你的分区内他们做什么操作,你的分区间做什么操作,对不对,所以这个就叫分区内,这个就叫分区间了,所以啊,咱们别的先不看它,咱们在这里来,我们写上括号啊,写上括号,然后呢,我们写上一个X,我们写上一个Y,然后呢,干什么呢?我们写上,因为我们要求的是它们里面的最大值,那么两两比较的话,那么谁大谁保留呗。那所以呢,大家看一下我们来,我们是不是就可以写上叫ma,点我们的ma呀,然后写上一个X,一个写上一个我们的这个Y行不行啊,同学们,我们这么写可以吧,哎,就是这样啊呃,然后呢,我们再来看啊,同学们往下走。
07:16
那么这是我们的什么啊,这是我们的第一个啊,这是我们的第一个计算规则,分区内的求最大值嘛,诶老师ma ma什么意思,这个咱们在之前给那大大家看那个分区数的时候是不是要mass还记得吗?有个叫max min啊,这个咱们之前应该是说过的啊,叫ma.min它是两个数,取它小的值吧,那现在呢,我们是什么呢?我们的max.max它是X和Y啊,X和Y取它们两个大的那个值啊,就是这样,好,这是我们的分区内的计算规则,那么分区间,那么当你分区内已经拿到数据了,那么我们相同的可以分区间,不就是两两聚合吗?所以说放到这里X和Y,然后放到这里我们是不是应该是X再加上Y呀?
08:08
对不对,诶你这么写就可以了,所以啊,这是我们的第二个参数所表述的含义,叫分区间的计算规则,好,这两个呢,咱们都写完了,那接下来我们来看它的第一个参数列表,第一个参数列表是什么意思呢?大家看一下,叫做zero value,它的这个参数列表呢,我们叫做zero value。从字面含义上来讲叫做零值,其实说白了就是初始值啊,第一个参数列表啊,需要嗯。需要传递一个参数啊,它表示为我们叫初始值,诶就是这样啊,那你说奇怪呀,你拿这个初始值干什么呀,对不对,那么你初始值它的作用是什么?这里咱们大家想一想,我们要想去取它的最大值的情况下,如果你第一回碰见了这个一,我问你,你怎么知道这个一是大还是小呢?
09:06
对不对,就是你当碰见第一个这个K的时候,那么你没有办法做两两计算呢,那你怎么知道它是大还是小呢?你就没有办法做逻辑操作,对不对,所以这个逻辑就用不上,那么你的功能上可能就有缺失,所以呢,它需要的是什么?它需要的是当你碰见第一个值的时候,得有一个值让你进行分区内的计算,所以啊,它的主要用途是什么啊来说一下,嗯。它主要啊来主要用于啊,当我们叫做什么呢?当我们嗯,碰见我们的第一个K的时候啊,T的时候,和我们的value进行我们分区内计算,对不对,否则呀,那么你的这个一做什么计算呢?H相加呀,还取值价值我就不知道了,那所以在这种情况下,我们需要一个初始值跟我们的第一个这个值做计算,所以大家看一下我们这里呢,就简单了,反正取大的值嘛,对不对,那大的值这个一,反正你跟那个值谁大谁小,你要确定呗,那我给个零不就完了吗?你给个零,那这样的话零和一,那不就一大吗?那么一和二不就二大吗?二不就出来了吗?同样道理,你的这个地方在另外一个分区里面,那么三和零,记住啊,每个分区自己做操作,那么这个时候三和我们的零三大,三和四四大,那么四不就出来了吗?然后二和四两两相加不就是六吗?所以这么写的话,结果就应。
10:33
应该能够出来啊,好了,那我们现在试一试吧,我们写上点,我们叫collect,嗯。第二,我们的for it。然后。好,写完之后,现在我们来运行看一看,咱们的结果到底是什么样子的啊,跟我们刚才的分析啊,是不是相同,我们要来看一看,嗯。因为咱们的数据比较简单呢,其实如果数据量多的话,这个效果呢,可能也能看得出来啊,同学们看一下这是不是我们的A啊,我们的六啊,诶结果完全相同,没有任何的问题,对吗?
我来说两句