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

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

  1. 分区升序排序,分区和排序的字段一致(不能自己指定排序规则,例如降序)
  2. 分组的规则为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 负责区内排序,分区字段和排序字段可以不同

  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 区别

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

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值