在大数据处理时,排序是一个非常重要的功能,可以说如果不排序,那么大数据查询出来的结果也将没有价值,那么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
如有错误,欢迎评论区指正
部分来自于尚硅谷,如有侵权联系删。