Hive学习之排序
Posted mayucheng123
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Hive学习之排序相关的知识,希望对你有一定的参考价值。
Hive排序
一、全局排序(order by)
Order by:全局排序,只有一个reducer
1、使用 Order by 子句排序
升序:ASC,可以不写,默认是升序
降序:DESC,降序
2、order by 语句使用在select语句的结尾
3、案例实操
-- (1) 查询员工信息按工资升序排序 select * from emp order by sal; -- (2) 查询员工信息按工资降序排序 select * from emp order by sal desc;
二、每个MapReduce内部排序(sort by)
Sort by : 对于大规模的数据集来说Order by 的效率特别低。很多情况下,不需要全局排序,此时可以使用sort 不要。
Sort by是为每个reducer 产生一个排序文件,对每个reducer内部进行排序,对全局结果不是排序。
案例:
-- 1、设置Reduce个数 set mapreduce.job.reducers = 3; -- 2、查看设置reduce个数。 set mapreduce.job.reducers; -- 3、根据部门编号降序查看员工信息。 select * from emp sort by deptno desc; -- 4、将查询结果导入文件中 insert overwrite local directory ‘/opt/module/datas/sortby-result‘ select * from emp sort by deptno desc;
三、分区排序(Distribute by)
Distribute by :在某些情况下我们需要控制某个特定行到哪个reducer,通常为了后续的聚合运算,Distribute by 子句可以做这件事儿,Distribute by 类似于MR中的partition,进行分区,结合 Sortby使用。
对于distribute by 进行测试的时候,一定要分配多reduce进行处理。否则无法看到效果。
案例:
-- 先按照部门编号分区,再按照员工编号降序排序。 set mapreduce.job.reducers = 3; insert overwrite local directory ‘/opt/moudle/datas/distribute-result‘ select * from emp distribute by deptno sort by rmpno desc;
注意:
1、distribute by的分区规则是根据字段的hash码与reduce的个数进行模运算 后,余数相同的分到一个区。
2、hive 要求 distribute by子句放在 sort by 子句的前面。
四、Cluster by
当分区字段(distribute by)和排序字段( sort by)相同时,可以考虑用 Cluster by。
cluster by :除了具有 distribute by 的功能外还具备 sort by 的功能。但是排序只能是升序排序,不能指定排序规则为升序或者降序。
案例:
-- 以下两种写法等到相同的结果 select * from emp cluster by deptno; select * from emp distribute by deptno sort by deptno;
注意:
按照部门编号分区。不一定就是固定得单个数值,也可以是10号和20号部门分到一个分区里去。
以上是关于Hive学习之排序的主要内容,如果未能解决你的问题,请参考以下文章