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) { ...
随机推荐
- [golang] Glide 包管理
一.概述 golang的包管理工具有很多,本篇幅主要介绍glide进行包管理. 二.安装及命令介绍 go get github.com/Masterminds/glide glide create|i ...
- Java 打印程序设计实例
3.1 打印文本 3.1.1 应用场景 假设我们需要打印一个窗体的某个文本编辑域(可能只有几行,也可能包含多页)的内容,并且每页最多打印 54 行,如何实现呢? 3.1.2 解决方法 基本思路如下:首 ...
- LeetCode263——Ugly Number
Write a program to check whether a given number is an ugly number. Ugly numbers are positive numbers ...
- 乐观锁的一种实现方式—CAS
线程安全 众所周知,Java是多线程的.但是,Java对多线程的支持其实是一把双刃剑.一旦涉及到多个线程操作共享资源的情况时,处理不好就可能产生线程安全问题.线程安全性可能是非常复杂的,在没有充足的同 ...
- 15个Spring的核心注释示例
众所周知,Spring DI和Spring IOC是Spring Framework的核心概念.让我们从org.springframework.beans.factory.annotation和org ...
- 每日英语:5 Things to Know About Missing Malaysia Airlines Flight and Air Safety
Malaysia Airlines Flight MH370, with 239 people aboard, lost contact early Saturday with the airline ...
- 关于emoji表情
/** /* 表情编码 /* @param emoji:表情符号 **/ encodeEmoji: function (content) { var imgHtml = ""; v ...
- jquery改变元素上下排列的顺序
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- iOS 开发_..和self...的区别以及使用
相信很多初学者对_和self.之间的区别并没有一个大致的认识,那么下面对两者的区别做一个简单的介绍: 至于重写set和get方法,简要说明一下,当我们使用@property这用法之后,系统便会自动给我 ...
- CTF中常见Web源码泄露总结
目录00x1 .ng源码泄露 00x2 git源码泄露 00x3 .DS_Store文件泄漏 00x4 网站备份压缩文件 00x5 SVN导致文件泄露 00x6 WEB-INF/web.xml泄露 ...