00:00
好了,同学们,我们刚才用了第二种方式呢,给大家实现了这个功能啊,结果没问题啊,只不过这个思路看大家能不能想得到是吧,那好,我们接下来把这个关掉,咱们看看呀,还有没有能够优化的地方啊,来写上一个我们的二,然后这边写上个三,嗯,好,然后呢,我们点击OK啊OK,那把这个放过来,把这两个Q呢给它去掉啊,两个问题,嗯。那么我们接着呢,来往下啊,往下往下以后呢,我们来看看,基本上啊,这个思路上就已经比较顺了,对吧?只要数据能变成这个样子,那么我们合并的话,最终不就能够得到结果嘛,对不对,那突然我就想到了一个问题,那我现在如果数据呢,能够变成这个样子,那我为什么一开始的时候咱们数据不变成这个样子呢?什么意思呢?你现在是把我统计的结果你变成了这个count了,那如果大家想想我要是这个样子呢,它表什么意思,他是不是表示这个品类它点击了一次,然后这个再如果变成一呢?所以呀,这就意味着什么情况,我其实在最开始我的数据就可以变成这个样子,对不对,那也就意味着我们这里啊,其实完全可以减少咱们后续的这大量的reduce by key,也就意味着其实你这里什么reduce reduce太多了,只要你reduce,你其实就会有我们的Le,对不对,那么你大量的reduce其实性能本身就已经受到了影响,所以Q啊,咱们说一下,咱们写上啊,咱们来就是我们存在啊,我们现在的功能当中,它存在大量的杀Le操作,为什么呢?有大量的那个叫做reduce,而且是针对于不同的数据来做的,它不是说一个数据它。
01:52
不断的使用reduce,正好说到这呢,我们给大家说一下,就是我们的这个reduce by key啊,就是这样的一种什么呢?我们叫聚合算子,咱们这种聚合算值,那么其实啊,咱们的这个Spark本身就知道它需要sle,所以Spark会什么呢?提供我们的优化,就是它会在底层做优化,比方说那个叫预聚合,对不对,还有一个就是缓存。
02:18
我们明显的知道我们的这个reduce bank它会什么呢?就是比较慢,那如果你一旦要重新执行的话,那不更慢了吗?所以啊,它本身其实就提供了缓存操作,咱们之前那个CA这种东西啊,在我们SPA的底层就自动帮你做了,记住啊,我说的是reduce这种聚合算子啊,存在的这样的算子,它本身就有缓存操作,它是不需要重复读取的,所以呢,如果你有多个相同的reduce来做的话,其实性能并不会差太多。可是我们刚才说了,我们这里的数据都是什么不同的数据源,那没办法了,他必须要走沙Le,所以这种情况下就会感觉很为难,为什么很为难呢?就是我们当前的这个数据,诶,他必须得才能分别给他统计,但是我们刚才看到了,如果你的数据要变成了这个格式的话,其实你没有必要分别统计,你统一的统计也完全可以啊,所以啊,咱们的思路上就有一些变化了。同学们看啊,我现。
03:18
再把咱们的原始数据,咱们先拿到,拿到以后这个cash我们都可以不需要了,来我把这个思路呢,我们完全给它去掉,嗯。把这个呢,咱们去掉啊,去掉去掉以后干什么呢?同学们看啊,来,我们写上,我们这么写,将我们的数据啊,将我们的数据它转换我们的结构,记住啊转换结构转换成什么结构呢?我们写上咱们叫做点击的场合,点击的场合,如果是点击的场合的话,大家想一想,那如果你能直接就变成什么呢?我们叫品类,咱们叫品类ID,然后呢,我们写上括号,哎括号我们叫做什么呢?叫做点击的数量,哎,别点击数量咱们就要一,因为你就是一次点击嘛,所以我们写上一个零逗号,零,你这么写不就OK了吗?同样道理,如果是我们的什么,我们的下单啊,下单的乘盒,那你的这地方是不是就是零了,那它是不是就是一了?同样道理,来再往下,那这个应该是支付的场合来写上啊,咱们叫支付的场合,那么它是我们的零,那么它是我们的一,大家想想你的每一条。
04:29
数据如果能够变成这个样子,这个样子,这个样子,最后我是不是只需要一次聚合,那么相同的品类就可以把结果得到,所以啊,你会发现之前我们想的思路呢,是按照正常的方式,先统一点击,再统一下单,再统计我们的支付,现在你换了个思路以后,就在同一条数据中,就把它的点击、下单和支付同时存在。那这样的话,好像感觉逻辑就更加清晰了吧,对不对,所以说将数据转换结构,你转换结构以后,三啊来将啊来写上将我们叫相同的品类ID的点击数据啊的数据进行我们的分组聚合啊分组我们的聚合,哎聚合以后你得到的效果是什么呢?你得到效果呀,就应该变成了这个样子,咱们叫做什么呢?叫做点击数量,嗯,好,这个呢,我们写上咱们叫做下单数量对不对?诶咱们下单的数量,同样道理,这个叫做支付的数量,那其实跟我们后面不就直接能用了吗?所以啊,你根本就不需要那么多步骤,其实还是word count,只不过这个word没变,但是什么count有点变化了,咱们之前讲的是word count,那个count不变word变化对不对,现在变成了word不变count变化,其实啊,都是变来变去,变来变去让你。
05:51
理解他其中的深意呀,嗯,好,那我现在呢,就简单了,同学们我们来看看吧,嗯,首先第一个咱们就来了啊,诶对,正好把这后面也写上一下来。
06:02
干嘛呢,我们写上啊来,呃,将我们的这个统样统计啊,统计结果啊,根据我们的这个数量,嗯,根据数量它进行我们的降序排列啊,降序处理吧,嗯,然后取。然后取啊,咱们叫做钱啊十。前十名就可以了啊,然后这边写上一个五,嗯,后面咱们都不变啊,就是把前面的咱们稍微的变化一下啊嗯。好,那我现在来看一看吧,咱们在这里来写上我们的它点,记住啊,我们要转换结构了,咱们叫做map,嗯,那么这个map呢,我们就直接写,咱们拿到的是一个一个的行为的数据,好拿过来,那咱们得判断一下,首先action我们点,我们叫做split,然后写上啊。把这个呢,我们拿过来啊,拿过来呃,拿过来我想想啊,咱们这个地方写个下划线啊,然后呢,放到这边。
07:01
嗯,诶不行,为什么不行呢?因为啊咱们我我想想同学们想想,就是我们这样有个比较特殊的点,什么点呢?就是我们的下单和支付啊,它不是一个ID,所以啊你用这个map呀,有点不太合适,为什么呢?因为它可能是多个,它可能是多个对不对,所以啊,它等于把一行拆成多个,所以用map不合适啊,应该是用什么叫flat map啊,应该用扁平化操作,所以啊,咱们这个地方呢,可以稍微的咱们改一改啊,咱们改一改的情况下,那咱们的这个地方来啊,咱们写上,咱们在这个地方写上我们叫做action点,点了以后呢,我们写上叫做split,然后写上一个下划线,这个时候你拿到的就是我们的数据,对不对,诶就是这样。然后呢,我们接下来我们写上叫做if啊if如果你的date是啊,如果你的date是啊,咱们写上一个,咱们就括号六,如果你现在不等于负一,那说明什么意思呢?你就是点击的场合了啊,你就是点击的场合,那如果你是点击的场合的话,那还说啥呢?不就是这玩意儿吗?所以说直接咱们拷贝过来啊,直接拷贝拷贝过来以后,然后呢,放到这儿给他一个逗号啊来,我们写上一个一零。
08:18
零就可以了,但是问题来了呀,你现在是需个Fla map呀,你返回的结果应该是一个list呀,所以我就写上一个list,然后写个括号,然后再来啊,我这么写就可以了啊同学们看我现在呢,就是一个集合啊,集合里面放的是一个ta,这个tale当中是嗯,品类的ID啊,这是那个数量,哎,咱们就这么回事啊好,接下来我们再往下,咱们叫else if,嗯,好了,那如果呀,你的这个地方叫date是我记得应该是八对不对,如果是八,如果你不等于那。说明什么问题,说明你现在是下单的场合,所以放过来咱们写上叫下单的场合,那么下单的场合的话就有个问题了,什么问题呢?你的这个date是八,它应该会有多个数据,所以点咱们叫做split,点啊咱们叫split,给它一个逗号,给他一个逗号之后这里呢,我们就写上啊,咱们叫ids,等于它就可以了,那么ids的每一个我们点一下,咱们叫做map啊,然后给个ID,然后写个箭头,写个括号,然后括号里面我们写上一个ID,然后写个诶零逗号一,逗号零。
09:34
能明白我的意思吗?同学们,就是把你的那个ID啊,就变成我们的这个样子就够了,好再来咱们叫else if啊,好放过来,放过来以后记住了,这个时候应该是什么呢?应该是我们的这个支付的场合了,嗯,那支付的场合的话,这个应该是个十吧,对不对?好然后呢,我们拷贝,拷贝以后放到这里,然后给他一个我们的十啊。
10:01
啊,这个呢,我们写上应该叫做我们支付的场合啊,那行了,那你这么写完以后,那就剩下我们的else了,嗯,Else的话,那就是其他情况,那其他情况就没数据呗,咱们给他一个我们的什么new就可以了,所以大家会发现呢,我们在当前场合下,我们分了三种不同的这个操作,对不对,诶就是这样啊,那么我们这里呢,就得到了我们的数据了,嗯,那么这个数据我们给他来,我们写上点,点了以后VR回车,回车以后大家可以发现就变成了这个样子,对不对,那所以呢,我们写上啊,这个叫做flight r DD,好了,那你现在把结构转换以后,已经变成了这个样子了,那我们相同的品类是不是就可以两两聚合了,所以拷贝拷贝以后把这个去掉,放到这里,我们就直接来了,嗯。咱们叫flat RD叫reduce by key,然后呢,我们这里呢,就是我们的两个。
11:03
好了,那这个两个他的计算咱们之前不是写过了吗?那写过的话原封不动拿过来就行了呀,同学们,诶,放过来,放过来以后你拿到的就是我聚合的结果呀,所以放到这里来,诶,OK了。同学们有没有发现这种方式要比之前的逻辑要简单了很多,最起码代码量就少了很多,我只需要判断不同的场合,把它的数据结构我变一变就可以了。而且我们这里是不是只有一个一个杀Le操作,那么性能上就会得到提升,要比之前好太多了吧,之前你的杀的次数太多了,那么性能肯定慢,而我现在呢,通过这种方式提高了咱们的性能,但是你提高性能以后,你的这个地方结果对不对不知道,那我得把它看一看吧,运行。运行以后看看我们的结果有没有什么问题啊。
12:05
好,我们回过头来大家看一下6120,诶,我们这个地方好像有问题啊,同学们看,就是前面这个都是对的,但是我们这个地方好像都是零吧,我看看是不是我们拷贝的时候什么样写错了。诶,大家看一下你会发现什么了,你会发现咱们的这个地方支付的场合不应该是这个样子,对不对,应该是我们的什么一啊,我刚才拷贝的时候忘改了,所以啊,它的支付应该它这个地方是一呀,所以我们重新再来执行啊观察一下。如果数据跟我们之前的是一样的,那就是OK的,最起码其实那个我们的点击应该是对的,对不对?嗯,咱们接下来看看我们的那个支付和那个下单啊。好了,大家看一下是不是也没有什么太大的问题啊,哎,就是这样啊,好,我们就到这里。
我来说两句