Hive分组取TOPN数据

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Hive分组取TOPN数据相关的知识,希望对你有一定的参考价值。

参考技术A 语法格式:row_number() OVER (partition by COL1 order by COL2 desc ) rank
partition by:类似hive的建表,分区的意思;
order by :排序,默认是升序,加desc降序;
rank:表示别名
表示根据COL1分组,在分组内部根据 COL2排序,而此函数计算的值就表示每组内部排序后的顺序编号(组内连续的唯一的)

浙江,杭州,300
浙江,宁波,150
浙江,温州,200
浙江,嘉兴,100
江苏,南京,270
江苏,苏州,299
江苏,某市,200
江苏,某某市,100

主要注意打圈的:
row_number:顺序下来
rank:在遇到数据相同项时,会留下空位5,(第一列4,4,6)
dense_rank:在遇到数据相同项时,不会留下空位,(红框内第一列,4,4,5)

国家 城市 Visitors
阿联酋,阿布扎比,137
阿联酋,阿布扎比,146
阿联酋,阿布扎比,178
阿联酋,阿布扎比,337
阿联酋,阿布扎比,178
阿联酋,阿布扎比,227
阿联酋,阿布扎比,157
阿联酋,迪拜,144
阿联酋,迪拜,268
阿联酋,迪拜,103
阿联酋,迪拜,141
阿联酋,迪拜,108
阿联酋,迪拜,266
澳大利亚,悉尼,141
澳大利亚,悉尼,122
澳大利亚,悉尼,153
澳大利亚,悉尼,128
澳大利亚,墨尔本,294
澳大利亚,墨尔本,230
澳大利亚,墨尔本,159
澳大利亚,墨尔本,188
澳大利亚,堪培拉,249
澳大利亚,堪培拉,378
澳大利亚,堪培拉,255
澳大利亚,堪培拉,240

text Hive topN,分组topN问题解决方案

解决思路1: 通过order by col limit n实现全局排序

缺点是仅使用一个reducer, 数据量大的时候效率会非常低.

=============================

解决思路2: 通过sort by col limit n实现并行局部排序, 然后外层进行全局的order by col limit n全局排序

分析: 局部排序是并行的, 一个数据要想在最终的topN中出现, 首先必然能够在局部的topN中出现. 外层的order by col limit n虽然仍是全局的, 但数据量级已大大降低. 最终能够得到更高的效率和同样的结果.


============
对于分组topN, 直接使用分组排序函数解决即可.

以上是关于Hive分组取TOPN数据的主要内容,如果未能解决你的问题,请参考以下文章

大数据Hive3.x数仓开发窗口函数案例:连续N次登录的用户;级联累加求和;分组TopN

text Hive topN,分组topN问题解决方案

hive 分组排序,topN

Spark 两种方法计算分组取Top N

spark 分组取topn

spark分组取 topN