<Zhuuu_ZZ>Hive(八)排序

一 Order By

  • 全局排序,只有一个 reducer,会导致当输入规模较大时,需要较
    长的计算时间,结果全局有序。
  • 使用 ORDER BY 子句排序
  • ASC(ascend): 升序(默认)
  • DESC(descend): 降序
  • ORDER BY 子句在 SELECT 语句的结尾
-- 查询员工信息按工资升序排列 
hive (default)> select * from emp order by sal; 
-- 查询员工信息按工资降序排列 
hive (default)> select * from emp order by sal desc; 
-- 按照员工薪水的 2 倍排序 
hive (default)> select ename, sal*2 twosal from emp order by twosal; 
-- 按照部门和工资升序排序 
hive (default)> select ename, deptno, sal from emp order by deptno, sal ; 
  • 支持使用CASE WHEN或表达式
  • 支持按位置编号排序
    • set hive.groupby.orderby.position.alias=true;
select * from offers order by case when offerid = 1 then 1 else 0 end;
select * from offers order by 1;
  • 注意:与数据库中 order by 的区别在于:order by 在 hive.mapred.mode = strict 模式下必须指定 limit 否则执行会报错。
hive> select * from test order by id;      
FAILED: Error in semantic analysis: 1:28 In strict mode, if ORDER BY is specified, 
LIMIT must also be specified. Error encountered near token 'id' 
  • 原因: 在 order by 状态下所有数据会到一台服务器进行 reduce 操作也即
    只有一个 reduce,如果在数据量大的情况下会出现无法输出结果的情况,如果进行“limit n”,那只有 “n * map number”条记录传入到 reduce 端,只有一个
    reduce 也可以处理过来。

二 Sort By

  • 每个 MapReduce 内部进行排序,对全局结果集来说不是排序。
  • 不是全局排序,其在数据进入 reducer 前完成排序。
-- 设置 reduce 个数 
hive (default)> set mapreduce.job.reduces=3; 
-- 查看设置 reduce 个数 
hive (default)> set mapreduce.job.reduces; 
-- 根据部门编号降序查看员工信息 
hive (default)> select * from emp sort by empno desc; 
  • 如果用 sort by 进行排序,并且设置 mapred.reduce.tasks>1, 则 sort by 只保
    证每个 reducer 的输出有序,不保证全局有序。
  • sort by 不受 hive.mapred.mode 是否为 strict ,nostrict 的影响。
  • sort by 的数据只能保证在同一 reduce 中的数据可以按指定字段排序。
  • 使用 sort by 你 可 以 指 定 执 行 的 reduce 个数 ( set
    mapred.reduce.tasks=),对输出的数据再执行归并排序,即可以得到全
    部结果。
  • 注意:可以用 limit 子句大大减少数据量。使用 limit n 后,传输到 reduce 端
    (单机)的数据记录数就减少到 n* (map 个数)。否则由于数据过大可能出不
    了结果。

三 Dirtribute By

  • 类似 MR 中 partition,进行分区,结合 sort by 使用。
  • 注意,Hive 要求 DISTRIBUTE BY 语句要写在 SORT BY 语句之前。
  • 对于 distribute by 进行测试,一定要分配多 reduce 进行处理,否则无法看到
    distribute by 的效果。
  • 是在shuffle过程里从map到reduce时用distribute by 分配hash值
  • 确保具有匹配列值的行被分区到相同的Reducer
# 先按照部门编号分区,再按照员工编号降序排序 
hive (default)> set mapreduce.job.reduces=3; 
hive (default)> select * from emp distribute by deptno sort by empno desc; 

四 Cluster By

在这里插入图片描述

  • 当 distribute by 和 sorts by 字段相同时,可以使用 cluster by 方式。
  • cluster by 除了具有 distribute by 的功能外还兼具 sort by 的功能
  • CLUSTER BY = DISTRIBUTE BY + SORT BY
  • 不支持ASC|DESC
  • 排序列必须出现在SELECT column列表中
  • 为了充分利用所有的Reducer来执行全局排序,可以先使用CLUSTER BY,然后使用ORDER BY
# 以下两种写法等价 
select * from emp cluster by deptno; 
select * from emp distribute by deptno sort by deptno; 
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值