Hive 提供了4种排序方式:ORDER BY、SORT BY、 DISTRIBUTE BY 及 CLUSTER
BY.
1. ORDER BY
Hive 中的ORDERBY语句与SQL中的类似,可以对结果集进行全局排序,即 Hive
可对所有数据进行 Reducer 处理以保证全局有序,但当数据规模较大时此过程比较耗时。
所以在 strict(hive.mapred.mode=strict,默认是 nonstrict) 模式下,Hive 对 ORDER BY进行了限制,要求 ORDER BY 子句后必须跟随 “LIMIT”子句,以防止单个 Reducer处理时间过长。
【语法】
ORDER BY colName (ASC|DESC)? (,colName (ASC|DESC)?)*
ORDER BY 语句默认按 ASC(升序)排序,排序字段必须出现在SELECT 子句中。
注意
ORDER BY 性能较差,应尽量在排序前对数据进行过滤。
2. SORT BY
SORT BY 指出了数据在每个 Reducer 内如何排序,即 SORT BY 只在每个 Reducer
内对数据进行排序。语法上SORT BY 与ORDER BY 相似,但从作用上看,ORDER BY可以看作是 SORT BY 的一个特例:当 SORT BY 的Reducer 数目设置1时,等同于ORDER BY。所以两者真正的区别是:ORDER BY 强调全局有序,SORT BY 只强调Reducer 内局部有序。
3. DISTRIBUTE BY
DISTRIBUTE BY 控制 Map 的输出数据在Reducer 中的划分。如果 DISTRIBUTE BY指定列的值相同,则它们会被送到同一个 Reducer 中进行处理。
注意
DISTRIBUTE BY 必须写在SORT BY之前
4、 CLUSTER BY
CLUSTER BY 相当于 DISTRIBUTE BY 和SORT BY 的结合体。当 DISTRIBUTE BY和 SORT BY 都在同一列上操作时,如下2个语句是等价的。
select A,B,C from table distribute by A sort by A select A,B,C from table cluster by A
另外,CLUSTER BY 指定的列只能进行升序排序,无法手动指定排序方向。