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 ;
|