hive全局排序优化

在hive sql中进行全局排序时,和sql一样使用order by 进行全局排序. 但是需要注意, hive会将所有数据交给一个reduce来进行计算排序, 这样数据量就很大, 很耗费时间.

Hive的适用场景为离线批处理,在执行全量数据计算任务时,一般是不会用到全局排序的。但在数据查询中,全局排序会经常被用到,而Hive不擅长快速的数据查询,所以需要将Hive处理后的数据存放到支持快速查询的产品中,如Presto、Impala、ClickHouse等。术业有专攻,一个产品一定有自己的适用领域,如果用在不合适的场景,会造成资源浪费。

全局排序思路

如果在数据处理过程中必须要用到全局排序,则最好使用UDF转换为局部排序。实现思路为:先预估数据范围,假设这里数据范围是0-100,然后在每个Map作业中,使用Partitioner对数据进行自定义分发,0-10的数据分发到一个Reduce中,10-20的到一个Reduce中,依次类推,然后在每个Reduce作业中进行局部排序即可。

 

hive中的部分排序: DISTRIBUTE BY, SORT BY

SORT BY 只会在每个reducer中进行排序

DISTRIBUTE BY 控制map 中的输出在 reducer 中是如何进行划分的

如果对某一列既想采用SORT BY 也想采用 DISTRIBUTE BY ,

那么可以使用CLUSTER BY 进行排序。

注意:

   排序只能是升序排序(默认排序规则),不能指定排序规则为asc 或者desc。

 

但一般而言,对全量数据进行全局排序的场景很少,一般只需要保证查询结果最终有序即可,这时可以先使用子查询得到一个小的结果集,然后再进行排序。

如果是取TOP N的情况,则可以使用子查询,在每个Reduce中进行排序后,各自取得前N个数据,然后再对结果集进行全局排序,最终取得结果。

--从表中获取name长度为TOP10的数据
select a.id,a.name from 
(
 select id,name  from <table_name>  
 distribute by length(name)  sort by length(name) desc limit 10
 ) a 
 order by length(a.user_name) desc limit 10;

 

hive全局排序优化

上一篇:Java从零开始-06


下一篇:项目部署篇(一)后端springboot项目打包和部署