全局排序
使用 ORDER BY 语句全局排序
-
ASC(ascend): 升序(默认)
-
DESC(descend): 降序
可以指定多个排序字段
select * from emp order by deptno , job , sal desc
可以按照查询别名进行排序
select ename, sal*2 twosal from emp order by twosal;
区内排序
Sort By:每个Reducer内部进行排序,对全局结果集来说不是排序。
1.设置reduce个数
hive (default)> set mapreduce.job.reduces=3;
2.查看设置reduce个数
hive (default)> set mapreduce.job.reduces;
3.根据部门编号降序查看员工信息 指定分区字段
hive (default)> select * from emp distribute by dptno sort by empno desc;
4.将查询结果导入到文件中(按照部门编号降序排序)
hive (default)> insert overwrite local directory '/hive/sb'
select * from emp sort by deptno desc;
上面使用sortby对数据进行区内排序 , 但是没有指定分区字段 , 我们可以指定分区字段
distribute By 指定分区字段 , 按照字段的值的hashcode进行分区 , 然后使用sort by分区内排序
先按照部门编号分区,再按照员工编号降序排序。
set mapreduce.job.reduces=3;
insert overwrite local directory '/root/data/distribute-result' select * from emp distribute by deptno sort by empno desc;
当分区字段和排序字段一致的时候,可以使用cluster by 来简化 distribute by 和 sort by . 但是注意的是cluster by 只能按照字段的升序排列 ,不能指定排序规则为ASC或者DESC。
-- 这两种书写方式是一样的
hive (default)> select * from emp cluster by deptno;
hive (default)> select * from emp distribute by deptno sort by deptno;
总结
order by 对结果进行全局排序 limit 3
sort by 分区内排序 asc desc
distribute by 指定分区字段
cluster by 当分区字段和排序字段是同一个字段 ,并且是升序 可以使用 cluster by替代