Hive多字段分組取Top N且保留某列不相同記錄

1、問題背景sql

    1.先吐槽一下中國聯通本身的大數據開放能力平臺提供的計算集羣,Hive用的1.1,Spark用的1.5,Kafka0.8,個人天吶,原始的讓人抓狂,好多已經寫好的模型都要重寫......app

    2.數據格式函數

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

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

問題是:spa

對於紅色的1區域:咱們要都保留,由於flag相同;code

對於綠色的2區域:咱們只保留flag爲15的;blog

對於黃色的3區域:咱們都保留,由於只有一個app標籤;排序

那麼問題來了,Hive裏的分組是全字段的,如何在分組以後只保留其中一條或固定幾條的數據呢?Hive自帶三種函數來解決這個問題,先列出來記一下:ci

row_number() ,這個是順序下來;it

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 ;
相關文章
相關標籤/搜索