前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Hive全局排序解决之道

Hive全局排序解决之道

作者头像
十里桃花舞丶
发布2021-01-06 11:11:14
2K0
发布2021-01-06 11:11:14
举报
文章被收录于专栏:桥路_大数据

全局排序Order By

Hive中的全局排序,使用Order By来进行,具体语法为:

代码语言:javascript
复制
SELECT <select_expression>, <select_expression>, ...
    FROM <table_name>
    ORDER BY <col_name> [ASC|DESC] [,col_name [ASC|DESC], ...]

但在Hive中使用全局排序时,需要注意,Hive会将所有数据交给一个Reduce任务计算,实现查询结果的全局排序。所以如果数据量很大,只有一个Reduce会耗费大量时间。

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

全局排序思路

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

全局排序优化

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

代码语言:javascript
复制
select * from 
(select id,count(1) cnt from <table_name> where id!='0' group by user_id) a 
order by a.cnt;

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

代码语言:javascript
复制
--从表中获取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;

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021/01/05 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 全局排序Order By
  • 全局排序思路
  • 全局排序优化
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档