1. 程式人生 > >Hive多欄位分組取Top N且保留某列不相同記錄

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;