Hive语法之排序
文章目录
- Hive语法之排序
- 全局排序(Order By)
- 升序降序
- 按照别名排序
- 多个列排序
- 每个 Reduce 内部排序(Sort By)
- 设置 reduce 个数
- 查看设置 reduce 个数
- 分区排序(Distribute By)
- 设置 reduce 个数
- 簇排序(Cluster By)
全局排序(Order By)
Order By:全局排序,只有一个 Reducer
ORDER BY 子句排序
ORDER BY 子句在 SELECT 语句的结尾
ASC(ascend): 升序(默认)
DESC(descend): 降序
升序降序
查询员工按消费升序排列
select * from t_window order by cost;
查询员工按消费升序降序
select * from t_window order by cost desc ;
按照别名排序
按照顾客消费金额的 2 倍排序
select name, cost*2 twocost from t_window order by twocost;
多个列排序
按照日期和金额升序排序
select name, orderdate, cost from t_window order by orderdate, cost;
每个 Reduce 内部排序(Sort By)
Sort By:对于大规模的数据集 order by 的效率非常低。在很多情况下,并不需要全局排序,此时可以使用 sort by。
Sort by 为每个 reducer 产生一个排序文件。每个 Reducer 内部进行排序,对全局结果集来说不是排序。
设置 reduce 个数
set mapreduce.job.reduces=3;
查看设置 reduce 个数
set mapreduce.job.reduces;
根据消费金额查看顾客信息
select * from t_window sort by cost;
分区排序(Distribute By)
Distribute By: 在有些情况下,我们需要控制某个特定行应该到哪个 reducer,通常是为了进行后续的聚集操作。distribute by 子句可以做这件事。distribute by 类似 MR 中 partition(自定义分区),进行分区,结合 sort by 使用。
对于 distribute by 进行测试,一定要分配多 reduce 进行处理,否则无法看到 distribute by 的效果。注意:
distribute by 的分区规则是根据分区字段的 hash 码与 reduce 的个数进行模除后,余数相同的分到一个区。
Hive 要求 DISTRIBUTE BY 语句要写在 SORT BY 语句之前。
设置 reduce 个数
set mapreduce.job.reduces=3;
先按日期分区,再按金额降序
select * from t_window distribute by orderdate sort by cost desc;
簇排序(Cluster By)
当 distribute by 和 sorts by 字段相同时,可以使用 cluster by 方式。
cluster by 除了具有 distribute by 的功能外还兼具 sort by 的功能。但是排序只能是升序排序,不能指定排序规则为 ASC 或者 DESC。
cluster by = distribute by +sort by 。
两种写法等价
select * from t_window cluster by cost
select * from t_window distribute by orderdate sort by cost desc;