1、問題背景sql
1.先吐槽一下中國聯通本身的大數據開放能力平臺提供的計算集羣,Hive用的1.1,Spark用的1.5,Kafka0.8,個人天吶,原始的讓人抓狂,好多已經寫好的模型都要重寫......app
2.數據格式函數
第一列是device_number,第二列是prod_name,第三列是score,第四列是flag;大數據
問題是: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 ;
|