数仓常用排序详解
创始人
2024-03-06 06:15:23
0

目录

order by:全局排序

sort by:局部排序

cluster by:簇排序

group by

partition by 


order by:全局排序

order by 会对数据进行一次全局排序,所以说,只要hive的sql中指定了order by,那么所有的数据都会到同一个reducer进行处理(不管有多少map,也不管文件有多少的block只会启动一个reducer)。


order by 只在一个reduce中进行,所以数据量特别大的时候效率非常低。建议在小的数据集中使用order by进行排序
可以通过设置hive.mapred.mode参数控制执行方式:

若选择strict,则order by 需要指定limit(若有分区还有指定哪个分区)
若为nostrict,则limit不是必需的
即使设置了mapreduce.job.reduces的值大于1, 使用order by,时Hive在运行MR程序时也会设置为1覆盖

示例:

在这里插入图片描述

sort by:局部排序

sort by在每个reducer端都会做排序,为每个reduce产生一个排序文件。也就是说sort by能保证局部有序(每个reducer出来的数据是有序的,但是不能保证所有的数据是有序的,除非只有一个reducer)。
使用sort by的好处是:执行了局部排序之后可以为接下去的全局排序提高不少的效率(其实就是做一次归并排序就可以做到全局排序了)。

sort by 的数据在进入reduce前就完成排序。
sort by 基本上不受hive.mapred.mode影响

可以通过mapreduce.job.reduces 指定reduce个数,查询后的数据被分发到相关的reduce中。
如果使用sort by 排序,并且设置mapreduce.job.reduces>1,sort by只能保证每个reducer输出有序,不能保证全局数据有序。

示例:

在这里插入图片描述
示例:

在这里插入图片描述

 在有些情况下,你需要,这通常是为了进行后续的聚集操作。刚好可以做这件事。因此,distribute by经常和sort by配合使用。

distribute by:分区排序
DISTRIBUTE BY是控制map的输出在reducer是如何划分的
DISTRIBUTE BY是控制在map端如何拆分数据给reduce端的。
DISTRIBUTE BY可以控制某个特定行应该到哪个reducer。

distribute by 采集hash算法,在map端将查询结果中hash值相同的结果分发到对应的reduce文件中。
hive会根据distribute by后面列,对应reduce的个数进行分发,默认是采用hash算法。

注意:distribute by必须要写在sort by之前
示例:

我们所有的deptno相同的数据会被送到同一个reducer去处理,这就是因为指定了distribute by deptno,这样的话就可以统计出每个部门中各个员工sal的排序了(这个肯定是全局有序的,因为相同部门的员工会放到同一个reducer去处理)。


cluster by:簇排序

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

比如下面两个hql语句是等价的:

insert overwrite local directory '/usr/local/test/tt'
row format delimited fields terminated by '\t'
select * from tb_emp 
distribute by deptno
sort by deptno;
--两者功能等价
insert overwrite local directory '/usr/local/test/tt'
row format delimited fields terminated by '\t'
select * from tb_emp 
cluster by deptno;

示例:

group by

和distribute by类似 都是按key值划分数据,都使用reduce操作
唯一不同的是,distribute by只是单纯的分散数据,distribute by col – 按照col列把数据分散到不同的reduce。

group by把相同key的数据聚集到一起,后续必须是聚合操作。

示例:

在这里插入图片描述


partition by 

通常查询时会对整个数据库查询,而这带来了大量的开销,因此引入了partition的概念,在建表的时候通过设置partition的字段, 会根据该字段对数据分区存放,更具体的说是存放在不同的文件夹,这样通过指定设置Partition的字段条件查询时可以减少大量的开销。

示例:查询某一个人的工资并和其所在的部门的平均薪资进行对比。

select ename,sal,deptno,avg(sal) over(partition by deptno)
from tb_emp;

结果:

在这里插入图片描述

相关内容

热门资讯

「党建治学」蔡志强:以完善制度... 蔡志强:以完善制度推进党内监督和群众监督相统一 党建治学 ★★★★★ 【蔡志强:长安街读书会成...
民办学校举办者债务连带责任的法... 民办学校举办者的法律责任边界一直是教育法律实务中的复杂议题。其中,举办者是否需对学校债务承担连带责任...
广电网络近12个月新增诉讼案件... 12月25日,广电网络(600831)发布公告,本公司及下属公司近12个月内累计新增诉讼、仲裁案件金...
全国总工会、最高法、最高检联合... 人民网北京12月25日电 (肖聪聪)今日,全国总工会新闻中心举行2025年劳动法律监督“一函两书”典...
男子分居期间贷款28万元买车,... 12月24日,记者从新疆法制报获悉:近日塔城地区中级人民法院审结了一起案件,明确表明车贷因未用于共同...
“一函两书”制度织密劳动者保障... 近日,全国总工会联合最高人民法院、最高人民检察院,共同发布了2025年劳动法律监督“一函两书”典型案...
文投控股最新公告:涉及约1.9... 文投控股(600715.SH)公告称,公司作为被告涉及一起诉讼仲裁案件,涉案金额约1.91亿元及相关...
北京住房限购政策再松绑,上海、... 封面新闻记者 黄益辉 12月24日,北京出台楼市新政,成为全国住房城乡建设工作会议召开后首个优化房地...
李宏毅方回应被限制高消费:此事... 搜狐娱乐讯 25日,李宏毅与芒果娱乐解除经纪合同纠纷案被执行约1118万元,法院向其签发限制消费令引...
《四川省古籍保护利用条例》将于... 中新网成都12月25日电 (单鹏)四川省人大常委会25日在成都举行《四川省古籍保护利用条例》(以下简...