今天跟大家介绍一些 Hive 中的高级操作-数据聚合。这里主要根据以下三部分向大家介绍一下Hive 中常见的聚合:
- 基于 Group By 的基本聚合函数
- 高级聚合 -- GROUPING SETS & ROLLUP and CUBE
- 聚合条件 -- Having
1. 基于 Group by 的基本聚合函数
数据聚合是基于特定的条件使用数据汇总的形式来收集和表达更多的信息。Hive 提供了一些内置的聚合函数,如MAX
, MIN
, AVG
等等。Hive 还支持高级的聚合: GROUPING SETS
, ROLLUP
, CUBE
,分析函数[analytic functions],以及 windowing。
Hive 的基本内置的聚合函数通常使用GROUP BY子句。如果没有GROUP BY子句指定,默认情况下它是对整个表进行聚合。除了聚合函数, 所有其他 select 的列也必须包含在GROUP BY子句中(分析函数除外)。以下是几个例子使用内置的聚合函数:
注意:关于窗口函数 & 分区表函数 请参考 SQL Windowing 项目: http://blog.csdn.net/mike_h/article/details/50245995
- 没有GROUP BY字段的聚合:
<span style="font-size:12px;">jdbc:hive2://> SELECT count(*) AS row_cnt FROM employee; +----------+ | row_cnt | +----------+ | 5 | +----------+ 1 row selected (60.709 seconds</span>
- 对 GROUP BY字段进行聚合:
<span style="font-size:12px;">jdbc:hive2://> SELECT sex_age.sex, count(*) AS row_cnt . . . . . . .> FROM employee . . . . . . .> GROUP BY sex_age.sex; +--------------+----------+ | sex_age.sex | row_cnt | +--------------+----------+ | Female | 2 | | Male | 3 | +--------------+----------+ 2 rows selected (100.565 seconds)</span>
--select 字段名必须包含在 Group by 字段中
<span style="font-size:12px;">jdbc:hive2://> SELECT name, sex_age.sex, count(*) AS row_cnt . . . . . . .> FROM employee GROUP BY sex_age.sex; Error: Error while compiling statement: FAILED: SemanticException [Error 10025]: Line 1:7 Expression not in GROUP BY key 'name' (state=42000,code=10025) </span>
如果我们必须要 SELECT 一些 GROUP BY 中没有的字段, 我们有两种方法:
- 使用[analytic functions],引入后, 完全避免使用GROUP BY子句 (该方法会稍后进行介绍)
- 使用
collect_set
函数,该函数返回一组对象和消除重复的元素