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也可以单独使用。  

  

 

posted on 2017-09-07 21:22  最快的方法就是最慢  阅读(395)  评论(0编辑  收藏  举报

导航