Hive分组取Top K数据
阿里交叉面试问到了这个题,当时感觉没有答好,主要是对Hive这块还是不熟悉,其实可以采用row_number()函数。
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分组取Top K数据的更多相关文章
- Hive分组取Top N
Hive在0.11.0版本开始加入了row_number.rank.dense_rank分析函数,可以查询分组排序后的top值 说明: row_number() over ([partition ...
- sql 分组取最新的数据sqlserver巧用row_number和partition by分组取top数据
SQL Server 2005后之后,引入了row_number()函数,row_number()函数的分组排序功能使这种操作变得非常简单 分组取TOP数据是T-SQL中的常用查询, 如学生信息管理系 ...
- row_number和partition by分组取top数据
分组取TOP数据是T-SQL中的常用查询, 如学生信息管理系统中取出每个学科前3名的学生.这种查询在SQL Server 2005之前,写起来很繁琐,需要用到临时表关联查询才能取到.SQL Serve ...
- Spark 两种方法计算分组取Top N
Spark 分组取Top N运算 大数据处理中,对数据分组后,取TopN是非常常见的运算. 下面我们以一个例子来展示spark如何进行分组取Top的运算. 1.RDD方法分组取TopN from py ...
- sql分组取第一条数据
sq分组取第一条数据的一个方法: select * from ( select row_number() over(partition by ID order by ID) as rownum , * ...
- oracle 分组取第一行数据 ,查询sql语句
oracle 分组取第一行数据 SELECT * FROM ( SELECT ROW_NUMBER() OVER(PARTITION BY x ORDER BY y DESC) rn, t.* FR ...
- Hive分组取第一条记录
需求 交易系统,财务要求维护每个用户首个交易完成的订单数据(首单表,可取每个用户交易完成时间最老的订单数据).举例: 简写版的表结构: 表数据: 则 财务希望汇总记录如下: uid order_id ...
- oracle 根据字段分组取第一条数据及rank函数说明
当前有这样一个需求,根据外键对子表数据进行分组,取每组中的一条数据就行了,如图: 如:COMMANDID = 26的有两条,只取一条数据. sql语句: select * from(select SY ...
- c# 对List<T> 某字段排序,取TOP条数据
//排序的对象里的字段数据准备 try { cmr.v4 = Double.Parse(cmr.v3) - Double.Parse(cmr.v2); } catch (Exception e) { ...
随机推荐
- 实战Apache+Tomcat集群和负载均衡
实战Apache+Tomcat集群和负载均衡 目录 1. 什么是J2EE集群... 3 1.1. 序言... 3 1.2. 基本术语... 3 伸缩性(Scalability): ...
- robotframework + appium 获取android toast
android toast 获取主要方式是在出现toast的时候查找元素:xpath=//*[contains(@text,'记同步')] ,该xpath 表示为toast信息含有 "记 ...
- PHP实现JS的无符号右移(>>>)
举例: JS: 5>>>2 PHP function uright($a, $n) { $c = 2147483647 >> ($n - 1); return $c &a ...
- unity, ugui toggle, dynamic bool
假设Canvas_debugControl.cs有一个函数 public void showNextSceneButton(bool value){ ... } 欲将其添加到一个ugui toggle ...
- mysql打开binlog
修改mysql的配置文件,ubuntu下mysql的配置文件存放位置为:/etc/mysql/my.cnf 找到log_bin配置项,指定一个路径: 重启数据库:/etc/init.d/mysql r ...
- JDK1.5新特性,基础类库篇,线程类(Thread)增强了哪些
java.lang.Thread类增强特性如下: 线程优先级已经更改.java.lang.Thread.MIN_PRIORITY = 1 java.lang.Thread.NORM_PRIORITY ...
- 【Unity】2.7 检视器(Inspector)
分类:Unity.C#.VS2015 创建日期:2016-03-31 一.简介 Unity中的游戏是以包含网格.脚本.声音或灯光 (Lights) 等其他图形元素的多个游戏对象 (GameObject ...
- FFmpeg(2)-avformat_open_input()函数详解并示例打开mp4文件
一. 解封装 pts 是显示的时间 dts是解码的时间, 这个时间是用来做同步. av_register_all(), 注册所有的格式.包括解封装格式和加封装格式. avformat_network_ ...
- TimescaleDB比拼InfluxDB:如何选择合适的时序数据库?
https://www.itcodemonkey.com/article/9339.html 时序数据已用于越来越多的应用中,包括物联网.DevOps.金融.零售.物流.石油天然气.制造业.汽车.太空 ...
- Asp.Net MVC Areas区域说明
一般网站分为前台+会员后台+管理员后台,做过webform的人都会把会员后台页面放在user中,把管理员后台页面放在admin中 会员后台访问:www.xxx.com/user/xxx.aspx 管理 ...