• group by经常和 聚合函数 一起使用,按照一个活多个列对结果进行分组,然后对每个组进行聚合操作。

Group by语法

groupByClause: GROUP BY groupByExpression (, groupByExpression)*
groupByExpression: expression
groupByQuery: SELECT expression (, expression)* FROM src groupByClause?
  • 根据性别,计算去重用户数
  INSERT OVERWRITE TABLE pv_gender_sum
  SELECT pv_users.gender, count (DISTINCT pv_users.userid)
  FROM pv_users
  GROUP BY pv_users.gender;
  • 使用group by时,select语句只能包含group by的列和聚合函数
SELECT sum(b) GROUP BY
# 非法,select中含有b,而group by中没有b
SELECT
GROUP BY
  • 可以做多个聚合操作,但是,不能有两个聚合操作有不同的distinct
# 合法:count(DISTINCT) and sum(DISTINCT) 指定了相同的列
INSERT OVERWRITE TABLE pv_gender_agg
SELECT pv_users.gender, count(DISTINCT pv_users.userid), 
count(*), sum(DISTINCT pv_users.userid)
FROM pv_users
GROUP BY pv_users.gender;
# 非法:DISTINCT 指定了两个不同的列:userid、ip
INSERT OVERWRITE TABLE pv_gender_agg
SELECT pv_users.gender, count(DISTINCT pv_users.userid), count(DISTINCT pv_users.ip)
FROM pv_users
GROUP BY pv_users.gender;

高级特性:Multi-Group-By Inserts

简单查询或者聚合的输出,可以发送到多个表甚至是hadoopdfs文件(可以使用hdfs工具管理)。

  • 分别按照年龄和性别分组,求出每组去重后的用户数量,去往不同的地方(表和HDFS)
# 注意分号,下面这是一个SQL语句
FROM pv_users 
  INSERT OVERWRITE TABLE pv_gender_sum
    SELECT pv_users.gender, count(DISTINCT pv_users.userid) 
    GROUP BY pv_users.gender 
  INSERT OVERWRITE DIRECTORY '/user/facebook/tmp/pv_age_sum'
    SELECT pv_users.age, count(DISTINCT pv_users.userid) 
    GROUP BY pv_users.age; 

group by 优化

  • Map端先进行部分聚合:不是所有的聚合操作都需要在reduce端进行,先在map端进行聚合操作可以减少网络传输。(需要在map端占据更多的内存

    • 开启Map端聚合操作
      #默认为true
      set hive.map.aggr = true;
      
    • 设置Map端进行聚合操作的条目数目
        set hive.groupby.mapaggr.checkinterval = 100000;
      
  • 有数据倾斜时,进行负载均衡 :默认情况下,Map阶段同一Key数据分发给一个reduce,当一个key数据过大时就倾斜了。

    hive.groupby.skewindata = true
       

    当选项设定为 true,生成的查询计划会有两个MR Job。第一个MR Job中,Map的输出结果会随机分布到Reduce中,每个Reduce做部分聚合操作,并输出结果,这样处理的结果是相同的Group By Key有可能被分发到不同的Reduce中,从而达到负载均衡的目的;第二个MR Job再根据预处理的数据结果按照Group By Key分布到Reduce中(这个过程可以保证相同的Group By Key被分布到同一个Reduce中),最后完成最终的聚合操作。

  • 增加reduceTask数量: group by使用了reduce操作,效率受限于reduceTask数量,设置reduceTask数量可以提高效率(用的比较少)

set mapred.reduce.tasks=3;
select userid,count(1) as num from pv_usersgroup by userid;
                                    做SQL或类SQL查询工作,跟GROUP BY打交道太频繁了,使用人士应该都晓得:在SELECT子句中出现的字段或属性,如果不是在聚合函数中,那就必须要放到GROUP
 BY子句里面去,反过来,没有出现在GROUP BY子句中的字段或属性,只能在聚合函数中。。。。。。
       有时候,我们也需要对一个字段/属性作处理,假设有这样一个场景:在Hive数据库里有表my_table,my_ta
                                    有部分是转自:https://blog.csdn.net/lzm1340458776/article/details/43230517hive distribute by 和group by 的区别:group by是对检索结果的保留行进行单纯分组,一般总爱和聚合函数一块用例如AVG(),COUNT(),max(),main()等一块用。 group by操作表示按照某些字段的值进行分组,有相同的...
                                    在使用hive进行分组查询时,疑惑的一些地方进行验证,特此记录,也希望能给大家带来一点帮助!
hive进行分组查询时,select多个字段,则也需要按该多个字段进行分组,例:
select year,id_type ,count(1)
from tableName
where 条件
group by
year,
id_type;
如果select多个字段(year、id_type),而group by只有某个字段(month),则会报错:
但是,可以select 指定内容,可不用进行g
       (1)计算emp表每个部门的平均工资
hive (default)> select t.deptno, avg(t.sal) avg_sal from emp t group by t.deptno;
       (2)计算emp每个部门中每个岗位的...
                                    在工作中用hive进行数据统计的时候,遇到一个用group by 进行查询的问题,需要统计的字段为
gid,sid,user,roleid,time,status,map_id,num
其中time字段为时间戳形式的,统计要求为将各个字段按照每个小时的num总数进行统计
开始的时候写的hive SQL为
select gid,sid,user,roleid,time,status,ma
这里需要注意的是,
1、在hive中, 一旦有group by子句,那么,在select子句中只能有 分组字段,聚合函数以及值是唯一的字段。否则会提示Expression not in GROUP BY key '不应该在select中的字段名'。想想,如果一个字段的值的水平不止...
                                    查询操作group by、 order by、 join 、 distribute by、
sort by、 clusrer by、 union all底层的实现 
mapreduce常见的聚合操作count计数count(*)    所有值不全为NULL时,加1操作
count(1)    不管有没有值,只要有这条记录,值就加1
count(col)  col列里面的值为null,值不会加1,这个
                                    关于在hive中使用 group by 分组的误区
在hive中使用group by查询,如:
select name,sex from people group by sex;
会出现报错提示:
FAILED: SemanticException [Error 10025]: Line 1:15 Expression not in GROUP BY key 'name'
Error: Error while compiling statement: FAILED: SemanticException [E