09-HQL:Group、Order
写在前面的话:
该系列博文是我学习《 Hive源码解析与开发实战》视频课程的一个笔记,或者说总结,暂时没有对视频中的操作去做验证,只是纯粹的学习记录。
有兴趣看该视频的博友可以留言,我会共享出来,相互交流学习 ^.^。
*********************************************************************************************************
一、Hive的高级查询:
1.1、查询操作:
1、Order by :
按照某些字段排序。
样例:
select col1,other....
from table
where condition
order by col1,col2 [asc|desc];
这里order by 后面接几个列,每个列后面都可以接一个[asc|desc]表明是按照升序还是降序排列。
order by 由于是全局排序的,所以只能在一个reduce进行操作,因此如果当数据量太大的时候,不要轻易使用order by,这样的话会使大量的数据都跑到一个reduce中运行,如果reduce内存比较小,可能会报内存溢出,即便内存很大,也会花费很长时间,并且不管配置了有多少个reduce,都只会使用一个reduce。sort by 则是每一个reduce中排序,可能对应有多个reduce。
实验:
1.2、mapreduce底层实现:
1、order by实现原理:
上图过程解释:
首先左边是一个表,表目录下面可能有多个文件,这些文件通过一些map来进行读取。即:map从表中读取数据,并执行where条件,也就是说,where是在map中执行的,在map中执行where的好处是可以过滤掉一部分数据,从而传递给reduce的数据会少一些,减少了reduce的计算量并且减少了网络io。然后如果order by是按照col1和col2进行排序的话,那么map会将col1和col2的值组合为一个key,其他的值组合成一个value,然后传到一个reduce中去。
二、几个简单的聚合操作:
所谓的聚合操作,就是通过一个集合来算一个值。
2.1、count 计数:
count(*) : 所有字段的值都不是null的时候,计数才会算上该条记录;
count(1) : 只要有记录,不管是否字段值为空,那么计数就会算上该条记录;
count(col) :类似count(*),只不过count(col)是固定在某一列进行判断,也就是如果某一条记录的col字段值为NULL的话,那么计数是不算该条记录的;
2.2、sum求和:
sum(可转化为数字的值)返回bigint;如果传入的某个字段是String类型的话,它会将其转化为bigint再求和;如果用sum求和再加1的话,这个时候会报异常,因为sum返回的是bigint,我们需要把1转化为bigint,比如:sum(col)+1是不行的,必须这样sum(col)+cast(1 as bigint)
2.3、avg求平均值:
avg(可转化成数字的值)返回double;
2.4、distinct 不同值个数:
比如说统计某个字段值去重之后的个数:count(distinct col); 也就是该字段相同的几个值作为一个值来计数。当然distinct也可以单独使用。