目录
hive outline
Order By
- 全局排序,所有数据会进入一个reducetask,容易导致内存溢出
- 强烈建议将limit与Order By一起使用。避免数据集行数过大
- 当hive.mapred.mode设置为strict严格模式时,使用不带 limit 的Order By时会引发异常
- 升序
按员工工资(升序)排列
hive (default)> select * from emp order by sal;
- 降序
ASC(ascend): 升序(默认) DESC(descend): 降序
按员工工资降序排列
hive (default)> select * from emp order by sal desc;
- 多列排序
按员工所在部门和工资(升序)排序
先按照部门升序排序,如果部门编号相同在按照工资升序排序
hive (default)> select ename, deptno, sal from emp order by deptno, sal;
Sort By
Sort By 分区排序,数据排序在Reducer前完成,数据随机被分配到各个分区,如果要指定数据去哪个分区,需要使用Distribute By
(1)先设置reduce个数(即分为3个区)
set mapreduce.job.reduces=3;
(2)根据部门编号降序排序
select * from emp sort by empno desc;
(3)将查询结果导入到文件中(按照部门编号降序排序)
为什么导入到文件中,因为控制台看不出来效果
insert overwrite local directory '/opt/modules/output/sortby-result'
select * from emp sort by deptno desc;
带N的是部门编号,即最后一个字段
Cluster By
- 分区升序排序,分区和排序的字段一致(不能自己指定排序规则,例如降序)
- 分组的规则为hash散列:hash_func(col_name) % reduce task nums
按照学号进行分区,然后正序排序
--手动设置reduce task个数
set mapreduce.job.reduces =2;
select * from student cluster by sno;
假如说,
现在想法如下:把学生表数据根据性别分为两个部分,每个分组内根据年龄的倒序排序。你会发现CLUSTER BY无法完成了,下面的DISTRIBUTE BY +SORT BY就可以完成该功能
Distribute By+Sort By
Distribute By+Sort By 类似于Cluster By,不过Distribute By
负责分区,Sort By
负责区内排序,分区字段和排序字段可以不同
- Distribute By:类似MR中partition,进行分区,分区规则:hash散列
- Hive要求DISTRIBUTE BY语句要写在SORT BY语句之前
- 如果DISTRIBUTE BY +SORT BY的字段一样,并且升序排序,可以得出下列结论:
CLUSTER BY=DISTRIBUTE BY +SORT BY(字段一样)
把学生表数据根据性别分为两个部分,每个分组内根据年龄的倒序排
set mapreduce.job.reduces =2;
select * from student distribute by sex sort by age desc;
hive Order By Cluster By Distribute By+Sort By 区别
Order By 全局排序,所有数据会进入一个reducetask
Sort By 分区排序,数据排序在Reducer前完成,数据随机被分配到各个分区,如果要指定数据去哪个分区,需要使用Distribute By
Cluster By 一分区升序排序,分区和排序的字段致(不能自己指定排序规则,例如降序)
Distribute By+Sort By Distribute By负责分区,Sort By 负责分区内排序,分区字段和排序字段可以不同,排序规则也可以自己指定