Hive实践3之【排序及优化(order by,sort by,distribute by,cluster by)对比】

16 篇文章 2 订阅


\quad \quad 排序在一些业务场景中是不可缺少的一步,而Hive中支持的排序方式有四种,区别和应用场景又是什么呢?下面一起来探讨一下吧!

  • order by
  • sort by
  • distribute by
  • cluster by

1、order by——全局排序

  • 作用:对数据进行全局排序,只在一个reducer端进行。
    在这里插入图片描述

  • 缺点:当数据量特别大的时候,效率非常低

  • 语法:默认是升序排序,后面加关键字desc则为降序

-- 升序
order by 字段名
-- 降序
order by 字段名 desc
  • 注意:
    在set hive.mapred.mode=strict模式下,必须指定limit,否则执行select会报错,如下:
    在这里插入图片描述

  • 例子:

select * from employee order by salary limit 5;

在这里插入图片描述

2、sort by——内部排序

  • 作用:hive的sort by 是执行一个局部排序过程,其在数据进入reducer前完成排序。
    在这里插入图片描述

  • 这也就可以保证每个reduce的输出数据都是有序的(但并非全局有效)。这样就可以提高后面进行的全局排序的效率了。

  • 语法:用户可以指定任意期望进行排序的字段,并可以在字段后面加上asc关键字(默认)表示升序,desc关键字是降序排序。

-- 升序
sort by 字段名
-- 降序
sort by 字段名 desc
  • 注意:
    在使用sort by之前,需要先设置Reduce的数量>1(set mapreduce.job.reduces=n;),才会做局部排序,(如果Reduce数量是1,作用与order by一样,全局排序。)最后输出结果会按照Reduce的数量m分成m个文件。

  • 缺点:只能做局部排序,对输出的结果再执行归并排序,即可得到全部排序结果。

  • 优点:sort by 不受 hive.mapred.mode 是否为strict ,nostrict 的影响。且查询效率比order by高

  • sort by 是单独在各自的reduce中进行排序,所以并不能保证全局有序,一般和distribute by 一起执行,而且distribute by 要写在sort by前面。

  • 例子:
    (1)设置reduce个数

set mapreduce.job.reduces=2;

(2)查看设置reduce个数

set mapreduce.job.reduces;

(3)根据薪资对员工数据进行降序排序

select * from employee sort by salary desc;

结果:

在这里插入图片描述
(4) 将查询结果导入到文件中

insert overwrite local directory '/hive_data'
select * from employee sort by salary desc;

在这里插入图片描述

  • 可见,在输出目录下有3个reducer对应的3个文件

3、distribute by——分区排序

\quad \quad distribute by 控制 map的输出在reduer中是如何划分的,mapreduce job 中传输的所有数据都是按照键-值对的方式进行组织的,因此hive在将用户的查询语句转换成mapreduce job时,其必须在内部使用这个功能。默认情况下,MapReduce计算框架会依据map输入的键计算相应的哈希值,然后按照得到的哈希值将键-值对均匀分发到多个reducer中去,不过不幸的是,这也是意味着当我们使用sort by 时,不同reducer的输出内容会有明显的重叠,至少对于排序顺序而已只这样,即使每个reducer的输出的数据都有序的。如果我们想让同一年的数据一起处理,那么就可以使用distribute by 来保证具有相同年份(即相同KEY)的数据分发到同一个reducer中进行处理,然后使用sort by 来按照我们的期望对数据进行排序:

  • 作用:distribute by 控制map 中的输出在 reducer 中是如何进行划分的。使用distribute by可以保证相同KEY的记录被划分到一个Reduce 中。

在这里插入图片描述

  • distribute by 类似MR中partition(自定义分区),进行分区,结合sort by 使用。
  • 语法
distribute by 分区字段 order by 排序字段
  • distribute by 和order by 的常见应用场景有:

    • Map输出的文件大小不均
    • Reduce输出文件大小不均
    • 小文件太多
    • 文件超大
  • 例子:

(1)设置reduce的个数

set mapreduce.job.reduces=3;

(2)按照部门编号分区且按照薪资降序排序并将查询结果导入到文件中

insert overwrite local directory '/hive_data/distribute_result'
select * from employee distribute by deptID sort by salary desc;

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 同样也是分成了三个文件,但是部门一致的分到了一个文件中

4、cluster by

  • 作用:cluster by 除了distribute by 的功能外,还会对该字段进行排序,但是cluster by 不能指定排序为asc或 desc 的规则,只能是升序排列。
  • 当distribute by 和 sort by 字段相同时,cluster by=distribute by + sort by

在这里插入图片描述

  • 例子:

(1)设置reduce的个数

set mapreduce.job.reduces=3;

(2) 按部门分区排序

insert overwrite local directory '/hive_data/cluster_result'
select * from employee cluster by deptID;

等价于

insert overwrite local directory '/hive_data/cluster_result'
select * from employee distribute by deptID sort by deptID ;

在这里插入图片描述

在这里插入图片描述

参考资料:
1、https://blog.csdn.net/panfelix/article/details/106746341

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值