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

2021-08-29 23:25:14 字數 1003 閱讀 9250

一、問題背景

1.先吐槽一下中國聯通自己的大資料開放能力平台提供的計算集群,hive用的1.1,spark用的1.5,kafka0.8,我的天吶,原始的讓人抓狂,好多已經寫好的模型都要重寫......

2.資料格式

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

問題是:

對於紅色的1區域:我們要都保留,因為flag相同;

對於綠色的2區域:我們只保留flag為15的;

那麼問題來了,hive裡的分組是全字段的,如何在分組之後只保留其中一條或固定幾條的資料呢?hive自帶三種函式來解決這個問題,先列出來記一下:

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

rank() , 這個在遇到資料相同項時,會留下空位;

dense_rank() ,在遇到資料相同項時,不會留下空位;

這裡稍微有個取巧的地方就是我們將fflag欄位當做數字進行分組之後的排序,當然了可以人為手動的給不同flag打上權重,也行。

這樣的話就要同時使用row_number()和rank()來實現了,我的sql記錄一下:

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

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

orderbydevice_number;

Hive分組排序取top N

案列 求每個班級每科成績的第1名的學生。樣例資料如下 這個是典型的分組,組內排序求top n的問題,可以利用rank函式來解決。語法如下 rank over partition by col1 order by col2 排序時出現相等的值時會有相同的序列值,但會跳躍的排序,如 1,1,3,4,5,...

spark多欄位排序與取topN

前面介紹了 k,v 結構的rdd排序方法,下面來看更為複雜的情況,如果有更為複雜的多字段排序需求該怎麼處理?比如有如下資料 1 2 1 31 1 1 61 4 2 52 8 2 3我們現在想先對第一列逆序排,如果第一列相同再按第二列逆序排,該怎麼辦呢?以下兩種方式都可以滿足上面的需求 首先我們定義乙...

hive 分組排序,topN

hive 分組排序,topn 語法格式 row number over partition by col1 order by col2 desc rank partition by 類似hive的建表,分割槽的意思 order by 排序,預設是公升序,加desc降序 rank 表示別名 表示根據c...