hive 新增的聚合功能

hive 新增加了以下四种聚合功能,扩展了之前只能group by 一组的模式。

1. GROUPING SETS 这个功能比较容易理解,就如下表所示。

Aggregate Query with GROUPING SETS

Equivalent Aggregate Query with GROUP BY

SELECT a, b, SUM(c) FROM tab1 GROUP BY a, b GROUPING SETS ( (a,b) )

SELECT a, b, SUM(c) FROM tab1 GROUP BY a, b

SELECT a, b, SUM( c ) FROM tab1 GROUP BY a, b GROUPING SETS ( (a,b), a)

SELECT a, b, SUM( c ) FROM tab1 GROUP BY a, b

UNION

SELECT a, null, SUM( c ) FROM tab1 GROUP BY a

SELECT a,b, SUM( c ) FROM tab1 GROUP BY a, b GROUPING SETS (a,b)

SELECT a, null, SUM( c ) FROM tab1 GROUP BY a

UNION

SELECT null, b, SUM( c ) FROM tab1 GROUP BY b

SELECT a, b, SUM( c ) FROM tab1 GROUP BY a, b GROUPING SETS ( (a, b), a, b, ( ) )

SELECT a, b, SUM( c ) FROM tab1 GROUP BY a, b

UNION

SELECT a, null, SUM( c ) FROM tab1 GROUP BY a, null

UNION

SELECT null, b, SUM( c ) FROM tab1 GROUP BY null, b

UNION

SELECT null, null, SUM( c ) FROM tab1

2. Grouping__ID 这个功能是针对上面GROUPING SETS,当聚集某一列时会显示为NULL,而如果当前列的值正好有为NULL的,会导致冲突。这就引入了Grouping__ID的功能。Grouping__ID会返回一个bitvector(如果包含第几列,那2进制下该列就是1,比如选中1,2列来聚合,则Grouping__ID=3;只选中1列,则Grouping__ID=1;一列都没选中,则Grouping__ID=0)。这样可以通过Grouping__ID值来区分是聚合值还是当前列是null的值。

3. Cubes and rollups 这个功能纯粹是为了为了节省sql的长度,不用自己去写有规律的长的GROUPING SETS

GROUP BY a, b, c WITH CUBE 等同于 GROUP BY a, b, c GROUPING SETS ( (a, b, c), (a, b), (b, c), (a, c), (a), (b), (c), ( )).

GROUP BY a, b, c, WITH ROLLUP 等同于 GROUP BY a, b, c GROUPING SETS ( (a, b, c), (a, b), (a), ( )).

4. hive.new.job.grouping.set.cardinality  默认值是30,也就是在GROUPING SETS里面集合数据超过这个值的时候,会增加一个job来降低mapreduce的处理。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Hive 支持多种聚合函数,如 COUNT、SUM、AVG、MAX、MIN 等。使用聚合函数可以对表中的数据进行统计和分析。 以下是使用 Hive 实现聚合函数的语法: ``` SELECT function(column_name) FROM table_name WHERE condition GROUP BY column_name; ``` 其中,function 是聚合函数名称,column_name 是要进行聚合操作的列名,table_name 是表名,condition 是筛选条件,GROUP BY 子句用于分组聚合。在 GROUP BY 子句中指定的列名将会根据相同的值进行分组,然后对每个分组应用聚合函数。 举个例子,如果我们要统计每个部门的员工人数和平均工资,可以使用以下语句: ``` SELECT department, COUNT(*) AS count, AVG(salary) AS avg_salary FROM employee GROUP BY department; ``` 这里使用了 COUNT 和 AVG 两个聚合函数,分别统计了每个部门的员工人数和平均工资,并使用 AS 关键字对列名进行了重命名。 需要注意的是,在使用聚合函数时,除了使用 GROUP BY 子句进行分组聚合外,还可以使用 HAVING 子句进行筛选。HAVING 子句用于在分组后对分组进行筛选,只返回符合条件的分组。例如,如果我们只想返回员工人数大于等于 5 的部门信息,可以使用以下语句: ``` SELECT department, COUNT(*) AS count FROM employee GROUP BY department HAVING count >= 5; ``` 这里使用了 COUNT 聚合函数统计了每个部门的员工人数,并在 HAVING 子句中对 count 进行了筛选。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值