在大数据处理时,排序是一个非常重要的功能,可以说如果不排序,那么大数据查询出来的结果也将没有价值,那么hive作为hadoop数仓工具,自然也是可以提供排序整个功能的,接下来就为大家介绍一下,hive中查询排序的4个by。

全局排序

Order By

全局排序,不管分区,整个MR过程只提供一个mapper,也就是不管你分区多少,一律按照一个mapper的方式处理。

基本语法

sal按照升序排列 默认
select * from emp order by sal;

按照降序排列
select * from emp order by sal desc;

多个属性排列,在前的具有优先性
select * from emp order by cid,sal desc;

本身语法难度不大,但却又有个致命缺点,我们知道在大数据中,数据的强度是非常大的,为什么Hadoop在大数据中具有优势,就是因为其分布式的优点,但是如果不能分区,只有一个mapper处理,那么时间一定是非常长的,所以在后续我们会用到其他处理,不使用MR。

分区内部排序

Sort By

这个排序其实就很有意思啦,她是按照分区内部数据进行排序,简单来说就是有几个分区就有几个分区文件,分区文件内部有序,那么如何分区的呢?是有什么规律的嘛?

没有规律,就是随机分配的,分区靠使用者指定,指定多少个就把数据随机放入这些分区内,防止数据倾斜

例子:

设置设置分区个数
set mapreduce.job.reduces=3;

insert overwrite local directory '/opt/module/data/tss' 
select * from emp sort by deptno desc;

把查询结果导入本地文件中,属于覆盖写

最后本地寻找设置路径下的文件,会发现有三个,也就是我们设置的分区个数,打开每个文件会发现,每个文件内是有序的。

但是如果我们不把他查询结果写入本地,他就会按照全部输出,所以其实sort by的特点是,局部有序,全局无序的状态。 

分区

Distribute By

在有些情况下,我们需要控制某个特定行应该到哪个 reducer,通常是为了进行后续的聚集操作。

这个操作类似于我们再MR中写的自定义分区规则

这个规则默认是按照 key.hash % 分区个数来的。

例子:

set mapreduce.job.reduces=3;

insert overwrite local directory '/opt/module/data/tss' 
select * from emp
distribute by deptno 
sort by empno desc;

其中dis by 要写在sort by的前面

 上面的语句执行的结果就是按照 deptno 分区,按照empno大小排序

由此我们可以看出,dis by 一般是需要联用sort by使用的。

Cluster By

非常简单,就是上述dis by 和 sort by 如果by的属性都相同的话,直接两句变一句。

例子:

select * from emp cluster by deptno;

等价于

select * from emp distribute by deptno sort by deptno;

以上就是hive中的4个by

如有错误,欢迎评论区指正