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 ;

 




免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM