关于hive中的count与group by的总结

Group By语句从英文的字面意义上理解就是“根据(by)一定的规则进行分组(Group)”。它的作用是通过一定的规则将一个数据集划分成若干个小的区域,然后针对若干个小区域进行数据处理。 

注意:group by 是先排序后分组; 

count :.

1、 并不是说group by和count()操作不能同时使用,只是说查出来的东西不一样,每个都有其应用的情况,如本例:最开始方法查出来的就是分组以后每个分组的记录条数,如果程序中要计算每个分组的记录条数,恰恰用这种方法。

2 、要更多靠数据库去解决问题。

3 、意识到子查询的威力,当你遇到解决不了的问题的时候,可以试试用子查询去解决。(实践证明的)

count(distinct colA)的操作也可以用group by的方式完成,具体代码如下:

select count(distinct colA) from table1;

select count(1) from (select colA from table1 group by colA)alias_1;

这两者最后得出的结果是一致的,但是具体的实现方式,有什么不同呢?

上面两种方式本质就是时间与空间的权衡。

distinct需要将colA中的所有内容都加载到内存中,大致可以理解为一个hash结构,key自然就是colA的所有值。因为是hash结构,那运算速度自然就快。最后计算hash中有多少key就是最终的结果。

那么问题来了,在现在的海量数据环境下,需要将所有不同的值都存起来,这个内存消耗,是可想而知的。所以如果数据量特别大,可能会out of memory。。。

group by的实现方式是先将colA排序。排序大家都不陌生,拿最见得快排来说,时间复杂度为O(nlogn)O(nlogn),而空间复杂度只有O(1)O(1)。这样一来,即使数据量再大一些,group by基本也能hold住。但是因为需要做一次O(nlogn)O(nlogn) 的排序,时间自然会稍微慢点。。。

总结起来就是,count(distinct)吃内存,查询快;group by空间复杂度小,在时间复杂度允许的情况下,可以发挥他的空间复杂度优势

猜你喜欢

转载自blog.csdn.net/Griezmann_7/article/details/83050827