日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

hive udf 分组取top1_Hive分组取Top K数据

發布時間:2025/4/16 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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数据的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。