Hive多字段分组取Top N且保留某列不相同记录

一、问题背景

    1.先吐槽一下中国联通自己的大数据开放能力平台提供的计算集群,Hive用的1.1,Spark用的1.5,Kafka0.8,我的天呐,原始的让人抓狂,好多已经写好的模型都要重写......

    2.数据格式

第一列是device_number,第二列是prod_name,第三列是score,第四列是flag;

https://img.mukewang.com/5b9b66930001bc9b04470640.jpg

问题是:

对于红色的1区域:我们要都保留,因为flag相同;

对于绿色的2区域:我们只保留flag为15的;

对于黄色的3区域:我们都保留,因为只有一个app标签;

那么问题来了,Hive里的分组是全字段的,如何在分组之后只保留其中一条或固定几条的数据呢?Hive自带三种函数来解决这个问题,先列出来记一下:

row_number() ,这个是顺序下来;

rank() , 这个在遇到数据相同项时,会留下空位;

dense_rank() ,在遇到数据相同项时,不会留下空位;

这里稍微有个取巧的地方就是我们将Fflag字段当做数字进行分组之后的排序,当然了可以人为手动的给不同flag打上权重,也行。

这样的话就要同时使用row_number()和rank()来实现了,我的sql记录一下:

1
2
3
4
5
6
7
8
9
10
create  table  v1_final_app_score_20180914  as
select  device_number,prod_name,score,flag  from  (
select  device_number,prod_name,score,flag,rank() 
over (partition  by  device_number  order  by  flag  desc as  rank_num  from  (
select  device_number,prod_name,score,flag  from  (
select  device_number,prod_name,score,flag,row_number() 
over (partition  by  device_number,prod_name  order  by  flag  desc as  num 
from  v1__app_score
)t  where  t.num = 1 ) tt ) ttt  where  ttt.rank_num = 1 
order  by  device_number ;



猜你喜欢

转载自www.cnblogs.com/qoix/p/9649369.html