hive的排序

142 阅读2分钟

这是我参与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兼具了这两个排序的功能,但是特别要注意的是这个排序只能是升序、升序、升序。