小谈:只要我以为,这不是误会,谁会是宝贝
今天没有摆烂,今天大早上起来在学校用土豆做的服务器上面选课,说实话奥,分批次选课,顶多不到8000多人、就卡的不得了,咱Java学的不精,看到各个微信公众号推送的高并发变成广告,建议学校的领导去学学高并发。而且也不是同时在线八千人。估计顶多两三千人,最多四五千人把。我的评价是不如原神
Hive中的聚合模式什么是聚合?聚合就是将多行的数据缩减成一行或者是少数几行的计算模式。
其实在我们刚开始学习mr的时候,就用到了聚合模式。
举个例子 wordCount
hello 1 hello 1,1 hello 2
word 1 word 1 word 1
hello 1 time 1 time 1
time 1
Map阶段 + Shuffle阶段 Reduce阶段
如果使用mr代码来写,在reduce里面就是遍历values,然后将其累加。
这就是Reduce的代码,我们可以在shuffle中进行预聚合。这样的话,在Reduce阶段就可以少很多工作量。
就好比,让你一次性吃完这份烤全羊,那肯定不可能,但是让你分两次吃,中午吃一口,下午吃一口。渍渍渍,吃完了。一口容易噎死,但是两口就可以解决。道理是这个道理,下面来看看各种聚合的模式把
Distinct模式在上一篇博客中,我们提到了distinct用来去重的,会group by分组。
如果我们在Hive的Map阶段开启预聚合,那么distinct会先在Map阶段预聚合,然后在Reduce阶段进行全局的聚合。
在Map阶段的预聚合之后,我们会过滤掉一批数据,这样在Reduce里面的数据就少了。就像水库一样,水大的时候,水库就会先堵水,慢慢放水。这样下游的居民和田地不会被泛滥的洪水所侵入,如果没有水库,水流直接飞泻,那么居民区和田地都会被洪水冲刷。造成经济损失。
set hive.map.aggr=true;--开启Map端的聚合 select distinct s_score from student_tb_orc
首先开启Map端的聚合,会在map阶段的时候对s_score进行预聚合,输出不重复的s_age。
然后在Reduce中将Map阶段中输出的s_age进行全局聚合。在Map端的预聚合会根据s_age进行排序,从小到大。
Count(*),Count(列)的聚合这篇文章以前讲过,请移步
https://blog.csdn.net/weixin_46300771/article/details/122371720?spm=1001.2014.3001.5501
可计算中间结果的聚合模式通常计算过程中,数据如果可以被聚合,那么我们会在开始进行局部聚合,将局部聚合的数据汇总到一起,在进行总的聚合。
这种聚合模式是非常的高效的,因为大量的数据在前面的数据中已经被处理掉了,之后处理的数据的量并不会造成负担。
常见的聚合函数sum,max,avg.下面以sum为例子进行讲解。
通过先对两个文件的数据分别进行求和,然后将各个文件的总合聚合在一起,然后相加。
很明显,在reduce的时候数据量已经很少了几乎已经不需要继续计算了
不可计算中间结果的聚合模式
上面讲的是不可计算中间结果的聚合模式,现在讲的是可聚合的中间结果的聚合模式。
前面数据倾斜的博客里面见过collection_set这个函数就是中介结果不可计算,会将一整个字段的所有数据放到一个数组里面。为什么说它是不可计算中间结果呢?
很简单,因为它是将数据都存放在数组里面,仅此而已,同时我们也没有对他进行计算。
举个例子,让你心服口服
explain select collect_list(s_score) from student_tb_orc;
从执行计划表里面可以看出来
value expressions:_col10(type : array
好好学习,天天向上。
Hive中你不知道的聚合到此结束,下午更新表连接。’’



