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

  一、问题背景

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

  2.数据格式

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

  

 

  问题是:

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

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

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

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

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

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

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

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

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

  

  createtablev1_final_app_score_20180914as

  selectdevice_number,prod_name,score,flagfrom(

  selectdevice_number,prod_name,score,flag,rank()

  over(partitionbydevice_numberorderbyflagdesc)asrank_numfrom(

  selectdevice_number,prod_name,score,flagfrom(

  selectdevice_number,prod_name,score,flag,row_number()

  over(partitionbydevice_number,prod_nameorderbyflagdesc)asnum

  fromv1__app_score

  )twheret.num=1)tt)tttwherettt.rank_num=1

  orderbydevice_number;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值