目录

  • ​​hive outline​​
  • ​​Order By​​
  • ​​Sort By​​
  • ​​Cluster By​​
  • ​​Distribute By+Sort By​​
  • ​​hive Order By Cluster By Distribute By+Sort By 区别​​

hive outline

​​链接​​

Order By

  1. 全局排序,所有数据会进入一个reducetask,容易导致数据倾斜
  2. 强烈建议将limit与Order By一起使用。避免数据集行数过大
  3. 当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

  1. sort by 分区排序,数据排序在Reducer前完成
  2. 随机分配数据区哪个分区,所以常结合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的是部门编号,即最后一个字段​

hive Order By Cluster By Distribute By+Sort By_字段

Cluster By

  1. 分区升序排序,分区和排序的字段一致(不能自己指定排序规则,例如降序)
  2. 分组的规则为hash散列:hash_func(col_name) % reduce task nums

按照学号进行分区,然后正序排序

--手动设置reduce task个数
set mapreduce.job.reduces =2;
select * from student cluster by sno;

hive Order By Cluster By Distribute By+Sort By_hive_02

​假如说,​​现在想法如下:把学生表数据根据性别分为两个部分,每个分组内根据年龄的倒序排序。你会发现CLUSTER BY无法完成了,下面的DISTRIBUTE BY +SORT BY就可以完成该功能

Distribute By+Sort By

Distribute By+Sort By 类似于Cluster By,不过​​Distribute By​​​负责分区,​​Sort By ​​负责区内排序,分区字段和排序字段可以不同

  1. Distribute By:类似MR中partition,进行分区,分区规则:hash散列
  2. Hive要求DISTRIBUTE BY语句要写在SORT BY语句之前
  3. 如果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_升序_03

hive Order By Cluster By Distribute By+Sort By 区别

  1. Order By 全局排序,所有数据会进入一个reducetask
  2. Sort By 分区排序,数据排序在Reducer前完成,数据随机被分配到各个分区,如果要指定数据去哪个分区,需要使用Distribute By
  3. Cluster By 分区升序排序,分区和排序的字段一致(不能自己指定排序规则,例如降序)
  4. Distribute By+Sort By类似于Cluster By,不过​​Distribute By​​​负责分区,​​Sort By ​​负责区内排序,分区字段和排序字段可以不同,排序规则也可以自己指定