hive 里面其实我们可以设置reduce的个数. 类似于在mapreduce里面,最后封装一个Driver一样. 可以最后写我们需要运行多少个reducer. set mapreduce.job.reduces=3; 设置reducer个数为3. 但是在orderBy 里面,就算你最后设置了属性也不会生效.
全局排序(Order By)
Order By:全局排序,会进入到一个Reducer里面,最终会生成一个结果文件
1.使用 ORDER BY 子句排序
ASC(ascend): 升序(默认)
DESC(descend): 降序
2.ORDER BY 子句在SELECT语句的结尾
3.案例实操
(1)查询员工信息按工资升序排列
1 | hive (default)> select * from emp order by sal; |
(2)查询员工信息按工资降序排列
1 | hive (default)> select * from emp order by sal desc; |
按照别名排序
按照员工薪水的2倍排序
1 | hive (default)> select ename, sal*2 twosal from emp order by twosal; |
多个列排序
按照部门和工资升序排序
1 | hive (default)> select ename, deptno, sal from emp order by deptno, sal ; |
每个MapReduce内部排序(Sort By)
什么情况下map进入多个reduce呢? 分区.
Sort By:对每个Reducer里面的数据进行排序,对全局结果集来说不是排序。
Order by : 是对整个数据进行排序
1.设置reduce个数
1 | hive (default)> set mapreduce.job.reduces=3; |
2.查看设置reduce个数
1 | hive (default)> set mapreduce.job.reduces; |
3.根据部门编号降序查看员工信息
1 | hive (default)> select * from emp sort by empno desc; |
4.将查询结果导入到文件中(按照部门编号降序排序)
1 | hive (default)> insert overwrite local directory '/opt/module/datas/sortby-result' |
MapReduce里面是按照hash来进行分区的,所以我们无法指定分区. 所以他是没有规律的. 所以我们使用sort by的话 一般会和后面的字段连用,执行分区规则. 因为当我们不指定分区规则的时候,他就是随机的. 因为他害怕数据倾斜
可以看到,这是随机分配的,是没有规律的,我们一般排序肯定会先指定分区然后在排序,分区的话,一般我们会指定按照什么来分区,然而这里没有,说明这种排序方式不提供指定分区,从而出现了随机分配的现象
hive选择语法:
官网
https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Select
分区排序(Distribute By)和sort by 连用,因为sort by没有分区规则
先使用distribute by 然后再使用 sort by.
1 | 比如: 我可以按照部门编号进行分区,然后再部门内部做一个按照薪水的排序 |
所以,如果我们想通过区内排序的规则来达到我们order by的规则的话, 我们就需要自定义分区.就是要把我们不同的部门放到不同的区里面,然后拼接起来就到达了order by的效果. 而不是使用hash的方式分区.
这种方式确确实实分区了,分区之后你在哪个区就用sort by了
Distribute By:类似MR中partition,进行分区,就是先分好区,分好之后在每个partition里面进行sort by一下,结合sort by使用。
注意,Hive要求DISTRIBUTE BY语句要写在SORT BY语句之前。
对于distribute by进行测试,一定要分配多reduce进行处理,否则无法看到distribute by的效果。
Distribute指定正常的分区字段,指定之后就可以正常的分区操作了
Cluster By
当distribute by和sort by字段相同时,可以使用cluster by方式。
cluster by除了具有distribute by的功能外还兼具sort by的功能。但是排序只能是升序排序,不能指定排序规则为ASC或者DESC。
Sort by可以指定是升序还是降序,但是用cluster by之后就不能指定了,只能是升序
1)以下两种写法等价
1 | hive (default)> select * from emp cluster by deptno; |
注意:按照部门编号分区,不一定就是固定死的数值,可以是30号和60号部门分到一个分区里面去. 因为他是按照hash规则将hash相同的放到同一个分区里面的.
- 本文作者: xubatian
- 本文链接: http://xubatian.cn/hive常用函数之排序/
- 版权声明: 本博客所有文章除特别声明外均为原创,采用 CC BY 4.0 CN协议 许可协议。转载请注明出处:https://www.xubatian.cn/