这是我参与2022首次更文挑战的第25天,活动详情查看:2022首次更文挑战
本文介绍hive中较重要的部分,排序。hive里面排序还是很常见的,常常都有听到什么按照成绩排序,按照工资排序等等。
全局排序(order by)
先看下我们最为熟悉的order by。
Order By:全局排序,只有一个Reducer。
之前有看到hive可以设置reducer的个数,但是设置了多个,在这里也只会产生一个reducer,为了全局排序。
使用ORDER BY句子进行排序的实例:
select * from student order by age;
select * from teacher order by age desc;
从上述例子可以看出它包括升序和降序这两种方式,分别是ASC和DESC,默认是ASC(升序)
ORDER BY句子是放在SELECT的结尾处。
也可以是按照多个列进行排序
select * from student order by age,id;
也可以按照一个新定义的字段排序,比如 age*2,这个没啥真实意义,就是为了展示。
select name,age*2 doubleage from student order by doubleage;
针对每个MapReduce内部排序的方式:Sort By
首先设置reduce的个数
set mapreduce.job.reduce=3;
我们知道默认的reduce个数是-1,而在使用sort by排序的时候,可以设置reduce的个数来进行分组排序。
insert overwrite local directory ‘/opt/module/datas/sortby-result’ select * from student sort by age desc;
这个是将排序结果导出写入到文件当中,可以于order by的排序进行对比。
分区排序(Distribute By)
之前讲过hive中还有分区表是比较常用到的,这个分区排序,就类似MapReduce中的partition,即进行分区,可以结合上述的sort by进行一起使用。
在使用分区排序的时候,要特别注意的是,Hive规定了Distribute By语句是写在sort by前面的。 下面进行Distribute By实例,也是一样的先设置reduce的个数,为了看到实际的效果,可是设置3个reduce进行验证。
set mapreduce.job.reduce=3;
insert overwrite local directory ‘/opt/module/datas/distribute-test’ select * from student distribute by age sort by class desc;
最后一个Cluster By 在什么场景下可以使用到Cluster By呢,就是我们同时在用distribute by和 sort by,且字段相同的时候。 也就是说,Cluster By兼具了这两个排序的功能,但是特别要注意的是这个排序只能是升序、升序、升序。