1. 排序
Hive提供了4种排序方式: ORDER BY、SORT BY、DISTRIBUTE BY及CLUSTERBY。
1.1 ORDER BY
Hive中的ORDER BY语句与SQL中的类似,可以对结果集进行全局排序,即Hive可对所有数据进行Reducer处理以保证全局有序,但当数据规模较大时此过程比较耗时。所以在strict (hive.mapred.mode=strict,默认是nonstrict) 模式下,Hive 对ORDER BY进行了限制,要求ORDER BY子句后必须跟随“LIMIT”子句,以防止单个Reducer处理时间过长。
1.2 SORT BY
SORTBY指出了数据在每个Reducer内如何排序,即SORTBY只在每个Reducer内对数据进行排序。语法上SORTBY与ORDERBY相似,但从作用上看,ORDER BY可以看作是SORT BY的一个特例:当SORT BY的Reducer数目设置为1时,等同于ORDER BY。所以两者真正的区别是: ORDER BY强调全局有序,SORT BY只强调Reducer内局部有序。
1.3 DISTRIBUTE BY
DISTRIBUTE BY 控制Map的输出数据在Reducer中的划分。如果 DISTRIBUTE BY指定列的值相同,则它们会被送到同一个Reducer中进行处理。
1.4 CLUSTER BY
CLUSTER BY相当于DISTRIBUTE BY和SORT BY的结合体。当DISTRIBUTE BY和SORTBY都在同一列上操作时,如下2个语句是等价的。另外,CLUSTER BY指定的列只能进行升序排序,无法手动指定排序方向。
2. 分组聚合
Hive提供了多种聚合函数。所谓聚合函数是指对一组值进行计算并返回单个值的函数,其通常与SELECT语句的GROUP BY子句一起使用。
2.1 分组
SELECT语句在未指定GROUP BY子句的情况下,会将整个表当作一个分组。例如count()函数便是对组内的所有行数进行统计,其默认统计整个表的行数而不需要指定GROUP BY。
2.2 基础聚合
常用的内置聚合函数列举如下。
max(col): 返回组内某列中的最大值。
min(col): 返回组内某列中的最小值。
count(*):返回组内总行数,包括值为NULL的行。
count(expr):返回组内expr表达式不是NULL的总行数。
count(DISTINCT expr):返回组内expr唯一且非 NULL的行的数量。
sum(col); 返回组内某列元素的总和。
avg(col); 返回组内某列元素的平均值。
collect set(col): 返回消除了重复元组的数组。
collect list(col): 返回允许存在重复元素的数组。
2.3高级聚合
在Hive中,新增了几种增强聚合功能。
(1) GROUPING SETS
GROUPING SETS可以实现对同一个数据集进行多重GROUPBY操作,这本质上是多个GROUP BY进行UNION ALL操作。
(2) CUBE与ROLLUP
CUBE与ROLLUP的功能比GROUPING SETS的功能强.CUBE子句可对分组列进行所有可能的组合聚合。ROLLUP子句用于在维度结构中计算聚合。
GROUP BY a,b,c WITH CUBE等价于GROUP BY a,b,c GROUPING SETS((a,b,c).(a,b),(a.c),(b,c),(a),(b),(c),0)
GROUP BY a,b,c WITH ROLLUP等价于GROUP BY a,b,c GROUPING SETS((a,b,c),(a.b).(a) 0)总的来说,Hive的增强聚合功能方便了部分有规律代码的编写,或者说缩短了代码的长度,其本质仍然是GROUP BY。