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;