提示
Hive SQL 教程 欢迎使用。提供建议、纠错、催更等加作者微信: gairuo123(备注:sql )和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
本文将介绍 Hive SQL 中对数据进行排序的方法。与标准 SQL 一样,HQL 也支持 ORDER BY 语句,但由于 Hive 对大数据的处理机制,需要我们在认识这些机制的基础上做些调整以达到 SQL 执行性能的最优化。
Hive SQL 还支持 sort by 进行排序,功能与 ORDER BY 一致:
SELECT column, another_column
FROM mytable
WHERE condition(s)
sort by column ASC/DESC
hive 中的 order by 会对查询出的结果集执行一次全局排序,意味着所有的数据都通过一个 reduce 进行处理过程,这对于大数据集,这个过程将消耗很大的时间来执行。
在严格模式下直接使用 order by 会报错,必须加上 LIMIT 关键字。
hive 的 sort by 是执行一个局部排序过程。这可以保证每个 reduce 的输出数据都是有序的(但并非全局有效)。这样就可以提高后面进行的全局排序的效率了。对于这两种情况,语法区别仅仅是,一个关键字是 order,另一个关键字是 sort。用户可以指定任意期望进行排序的字段,并可以在字段后面加上asc关键字(默认)表示升序,desc关键字是降序排序。
在使用sort by之前,需要先设置Reduce的数量>1,才会做局部排序,如果Reduce数量是1,作用与 order by一样,全局排序。
Hive SQL 还支持 distribute by 进行排序。distribute 意为分发、分配。
distribute by 控制 map 的输出在 reduer 中是如何划分的,mapreduce job 中传输的所有数据都是按照键-值对的方式进行组织的,因此 hive 在将用户的查询语句转换成mapreduce job 时,其必须在内部使用这个功能。默认情况下,MapReduce 计算框架会依据 map 输入的键计算相应的哈希值,然后按照得到的哈希值将键-值对均匀分发到多个reducer 中去,不过不幸的是,这也是意味着当我们使用sort by 时,不同 reducer 的输出内容会有明显的重叠,至少对于排序顺序而已只这样,即使每个 reducer 的输出的数据都有序的。
FROM records
SELECT year, temperature
DISTRIBUTE BY year
SORT BY year DESC, temperature DESC
以上例子子为在根据年份和气温对气象数据进行排序时,我们希望看到同一年的数据被放到同一个reducer中去处理。因而,这个结果也肯定是全局排序的。特别的,因为distribute by 通常和sort by 一起用,所以当distribute by 遇上 sort by时,distribute by要放在前面,这个不难理解,因为要先通过 distribute by 将待处理的数据从map端做分发,这样,sort by 这个擅长局部排序的才能去放开的干活。不然要是没有distribute by的分发,那么sort by 将要处理全部的数据,即全局排序,这不是 sort by的活,这样做只能拖慢集群工作效率。
Hive 的 cluster by 除了distribute by 的功能外,还会对该字段进行排序,所以 cluster by = distribute by + sort by 。
例如:
select * from students cluster by b_year
等价于:
select * from students distribute by b_year sort by b_year
cluster by 指定的列只能是降序,不能指定 asc 和 desc。
hive 的 order by ,sort by ,distribute by 和 cluster by 这几个语句,在 hive 中都有排序和聚集的作用,然而,它们在执行时所启动的MR却各不相同。
其中,以下语句只能降序,不能指定 asc 和 desc:
更新时间:2021-03-03 12:04:34 标签:hql hive sql 排序