hive udf 分组取top1_Hive分组取Top K数据
1、ROW_NUMBER,RANK(),DENSE_RANK()
語法格式:row_number() OVER (partition by COL1 order by COL2 desc ) rank
partition by:類似hive的建表,分區的意思;
order by :排序,默認是升序,加desc降序;
rank:表示別名
表示根據COL1分組,在分組內部根據 COL2排序,而此函數計算的值就表示每組內部排序后的順序編號(組內連續的唯一的)
1.1 案例
1.1.1 樣本數據
浙江,杭州,300
浙江,寧波,150
浙江,溫州,200
浙江,嘉興,100
江蘇,南京,270
江蘇,蘇州,299
江蘇,某市,200
江蘇,某某市,100
1.1.2導入數據
--執行下述語句
hive (temp)> hive -f 'HQL/loaddata.hql'>out/tmp;
-----------------------------------------------
drop table datatable;
CREATE table datatable (
province string,
city string,
people int)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
STORED AS TEXTFILE;
load data local inpath 'home/loaddata'
overwrite into table temp.datatable;
----------------------------------------------
--查看結果
hive (temp)> select * from datatable;
OK
province city people
浙江 杭州 300
浙江 寧波 150
浙江 溫州 200
浙江 嘉興 100
江蘇 南京 270
江蘇 蘇州 299
江蘇 某市 200
江蘇 某某市 100
1.2 按照人口降序排列,生成衍生變量
select province,city,
rank() over (order by people desc) rank,
dense_rank() over (order by people desc) dense_rank,
row_number() over(order by people desc) row_number
from datatable
group by province,city,people;
--結果
province city rank dense_rank row_number
浙江 杭州 1 1 1
江蘇 蘇州 2 2 2
江蘇 南京 3 3 3
浙江 溫州 4 4 4
江蘇 某市 4 4 5
浙江 寧波 6 5 6
江蘇 某某市 7 6 7
浙江 嘉興 7 6 8
主要注意打圈的:
row_number:順序下來
rank:在遇到數據相同項時,會留下空位5,(第一列4,4,6)
dense_rank:在遇到數據相同項時,不會留下空位,(紅框內第一列,4,4,5)
1.3 分組按照省份分區,再按照人口降序排列,生成衍生變量
select province,city,
rank() over (partition by province order by people desc) rank,
dense_rank() over (partition by province order by people desc) dense_rank,
row_number() over(partition by province order by people desc) row_number
from datatable
group by province,city,people;
--結果
province city rank dense_rank row_number
江蘇 蘇州 1 1 1
江蘇 南京 2 2 2
江蘇 某市 3 3 3
江蘇 某某市 4 4 4
浙江 杭州 1 1 1
浙江 溫州 2 2 2
浙江 寧波 3 3 3
浙江 嘉興 4 4 4
2取TOPN數據
2.1 按照國家提取TOP3
2.1.1 樣本數據:
國家 城市 Visitors
阿聯酋,阿布扎比,137
阿聯酋,阿布扎比,146
阿聯酋,阿布扎比,178
阿聯酋,阿布扎比,337
阿聯酋,阿布扎比,178
阿聯酋,阿布扎比,227
阿聯酋,阿布扎比,157
阿聯酋,迪拜,144
阿聯酋,迪拜,268
阿聯酋,迪拜,103
阿聯酋,迪拜,141
阿聯酋,迪拜,108
阿聯酋,迪拜,266
澳大利亞,悉尼,141
澳大利亞,悉尼,122
澳大利亞,悉尼,153
澳大利亞,悉尼,128
澳大利亞,墨爾本,294
澳大利亞,墨爾本,230
澳大利亞,墨爾本,159
澳大利亞,墨爾本,188
澳大利亞,堪培拉,249
澳大利亞,堪培拉,378
澳大利亞,堪培拉,255
澳大利亞,堪培拉,240
2.1.2導入數據
--執行下述語句
hive (temp)> hive -f 'HQL/loaddata.hql'>out/tmp;
-----------------------------------------------
drop table temp.tripdata;
CREATE table datatable (
country string,
city string,
Visitors int)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
STORED AS TEXTFILE;
load data local inpath 'home/loaddata'
overwrite into table temp.tripdata;
----------------------------------------------
----------------------------------------------
--查看結果
hive (temp)> select * from tripdata;
country city visitors
阿聯酋 阿布扎比 137
阿聯酋 阿布扎比 146
阿聯酋 阿布扎比 178
阿聯酋 阿布扎比 337
阿聯酋 阿布扎比 178
阿聯酋 阿布扎比 227
阿聯酋 阿布扎比 157
阿聯酋 迪拜 144
阿聯酋 迪拜 268
阿聯酋 迪拜 103
阿聯酋 迪拜 141
阿聯酋 迪拜 108
阿聯酋 迪拜 266
澳大利亞 悉尼 141
澳大利亞 悉尼 122
澳大利亞 悉尼 153
澳大利亞 悉尼 128
澳大利亞 墨爾本 294
澳大利亞 墨爾本 230
澳大利亞 墨爾本 159
澳大利亞 墨爾本 188
澳大利亞 堪培拉 249
澳大利亞 堪培拉 378
澳大利亞 堪培拉 255
澳大利亞 堪培拉 240
---格式:select 品牌,count/sum/其它() as num from table_name order by num limit 10;
select country,city,visitors
from tripdata
order by visitors desc
limit 5;
country city visitors
澳大利亞 堪培拉 378
阿聯酋 阿布扎比 337
澳大利亞 墨爾本 294
阿聯酋 迪拜 268
阿聯酋 迪拜 266
2.2 按照國家、城市提取TOP3
--取top10品牌下各品牌的top10渠道 ,格式:
select
a.*
from
(
select 品牌,渠道,count/sum/其它() as num row_number() over (partition by 品牌 order by num desc ) rank
from table_name
where 品牌限制條件
group by 品牌,渠道
)a
where a.rank<=10
select a.*
from (
select country,city,visitors, row_number() over (partition by country order by visitors desc ) rank
from tripdata
order by country,visitors desc
) a
where a.rank<=3;
--結果
a.country a.city a.visitors a.rank
澳大利亞 堪培拉 378 1
澳大利亞 墨爾本 294 2
澳大利亞 堪培拉 255 3
阿聯酋 阿布扎比 337 1
阿聯酋 迪拜 268 2
阿聯酋 迪拜 266 3
2.3 按照國家提取TOP5
--取top10品牌下各品牌的top10渠道中各渠道的top10檔期 ,格式:
select a.*
from
(
select 品牌,渠道,檔期,count/sum/其它() as num row_number() over (partition by 品牌,渠道 order by num desc ) rank
from table_name
where 品牌,渠道 限制條件
group by 品牌,渠道,檔期
)a
where a.rank<=10
select a.*
from (
select country,city,visitors, row_number() over (partition by city order by visitors desc ) rank
from tripdata
order by country,city,visitors desc
) a
where a.rank<=3;
--結果
a.country a.city a.visitors a.rank
澳大利亞 堪培拉 378 1
澳大利亞 堪培拉 255 2
澳大利亞 堪培拉 249 3
澳大利亞 墨爾本 294 1
澳大利亞 墨爾本 230 2
澳大利亞 墨爾本 188 3
澳大利亞 悉尼 153 1
澳大利亞 悉尼 141 2
澳大利亞 悉尼 128 3
阿聯酋 迪拜 268 1
阿聯酋 迪拜 266 2
阿聯酋 迪拜 144 3
阿聯酋 阿布扎比 337 1
阿聯酋 阿布扎比 227 2
阿聯酋 阿布扎比 178 3
總結
以上是生活随笔為你收集整理的hive udf 分组取top1_Hive分组取Top K数据的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux下安装nginx详细步骤_ma
- 下一篇: 语法转换_语法 | 句型转换之肯定句变否