hive top n
hive中一般取top n时,row_number(),rank,dense_ran()这三个函数就派上用场了,
先简单说下这三函数都是排名的,不过呢还有点细微的区别。
通过代码运行结果一看就明白了。
示例数据:
| 1 2 3 4 5 6 7 8 9 10 11 | 1   a   102   a   123   b   134   b   125   a   146   a   157   a   138   b   119   a   1610  b   1711  a   14 | 
sql语句
| 1 2 3 4 5 6 7 | selectid,name,sal,rank()over(partition bynameorderbysal desc) rp,dense_rank() over(partition bynameorderbysal desc) drp,row_number()over(partition bynameorderbysal desc) rmpfromf_test | 
结果

10 b 17 1 1 1
3 b 13 2 2 2
4 b 12 3 3 3
8 b 11 4 4 4
9 a 16 1 1 1
6 a 15 2 2 2
11 a 14 3 3 3
5 a 14 3 3 4
7 a 13 5 4 5
2 a 12 6 5 6
1 a 10 7 6 7

从结果看出
rank() 排序相同时会重复,总数不会变
dense_rank()排序相同时会重复,总数会减少
row_number() 会根据顺序计算
正好听到一个需求,求sal前50%的人
用这个写了一下,
| 1 2 3 4 5 6 7 8 9 10 | select* from(selectid,name,sal,rank()over(partition bynameorderbysal desc) rp,dense_rank() over(partition bynameorderbysal desc) drp,row_number()over(partition bynameorderbysal desc) rmp,count(*)over(partition byname) *0.5 ascountfromf_test) t wheret.rp <t.count; | 
感觉虽然可以实现,但是有点复杂,有没有更好的方法实现呢
NTILE
NTILE(n),用于将分组数据按照顺序切分成n片,返回当前切片值
NTILE不支持ROWS BETWEEN,比如 NTILE(2) OVER(PARTITION BY cookieid ORDER BY createtime ROWS BETWEEN 3 PRECEDING AND CURRENT ROW)
如果切片不均匀,默认增加第一个切片的分布
上面那个例子 正好可以用到这个
| 1 2 3 4 5 6 7 | select* from(selectid,name,sal,NTILE(2) over(partition bynameorderbysal desc) rnfromf_test) t wheret.rn=1 | 
hive top n的更多相关文章
- Linux简介及常用命令使用4--linux高级命令与技巧
		top 几个磁盘fdisk -l 磁盘空间 df -lhdf -al 查看进程:ps -ef"grep java杀死进程:kill -9 进程号 more中过滤 more xxx |grep ... 
- get top k elements of the same key in hive
		key points: 1. group by key and sort by using distribute by and sort by. 2. get top k elements by a ... 
- hive分组排序 取top N
		pig可以轻松获取TOP n.书上有例子 hive中比较麻烦,没有直接实现的函数,可以写udf实现.还有个比较简单的实现方法: 用row_number,生成排名序列号.然后外部分组后按这个序列号多虑, ... 
- hive的top n
		注意 hive 的hsql没有 top n这个功能,不像sql. 所以实现top n如下: 我想说的SELECT TOP N是取最大前N条或者最小前N条. Hive提供了limit关键字,再配合ord ... 
- Hive分组取Top N
		Hive在0.11.0版本开始加入了row_number.rank.dense_rank分析函数,可以查询分组排序后的top值 说明: row_number() over ([partition ... 
- Pig、Hive、MapReduce 解决分组 Top K 问题(转)
		问题: 有如下数据文件 city.txt (id, city, value) cat city.txt 1 wh 5002 bj 6003 wh 1004 sh 4005 wh 2006 bj 100 ... 
- Hive中SELECT TOP N的方法(order by与sort by的区别)
		我想说的SELECT TOP N是取最大前N条或者最小前N条. Hive提供了limit关键字,再配合order by可以很容易地实现SELECT TOP N. 但是在Hive中order by只能使 ... 
- Hive分组取Top K数据
		阿里交叉面试问到了这个题,当时感觉没有答好,主要是对Hive这块还是不熟悉,其实可以采用row_number()函数. 1.ROW_NUMBER,RANK(),DENSE_RANK() 语法格式:ro ... 
- hive中一般取top n时,row_number(),rank,dense_ran()常用三个函数
		一. 分区函数Partition By与row_number().rank().dense_rank()的用法(获取分组(分区)中前几条记录) 一.数据准备 --1.创建学生成绩表 id int, ... 
随机推荐
- 简单实现RN调用原生方法(IOS)
			在React Native中,一个“原生模块”就是一个实现了“RCTBridgeModule”协议的Objective-C类(个人理解RCTBridgeModule就是react与native之间的桥 ... 
- _rate_charaters
			该表可以控制特定玩家的掉率 guid 玩家角色guid,characters表中guid rate 掉落倍率,比如1.1,则该玩家普通掉率(groupid = 0时)提高1.1倍 
- hdu 2108 Shape of HDU 判断是否为凸多边形
			Shape of HDU Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Pro ... 
- P1262 间谍网络
			传送门 思路: ①在 Tarjan 的基础上加一个 belong 记录每个点属于哪个强连通分量. ②存图完成后,暴力地遍历全图,查找是否要间谍不愿受贿. inline void dfs(int u) ... 
- Oracle简单语句查询
			语法3-1:简单查询语句语法 SELECT [DISTINCT] * |列名称[AS][列别名],列名称[AS][列别名],...FROM 表名称[表别名]; 在整个简单查询之中,主要有两个子句完成: ... 
- C#连接数据库open函数失败
			错误信息:在与 SQL Server 建立连接时出现与网络相关的或特定于实例的错误.未找到或无法访问服务器.请验证实例名称是否正确并且 SQL Server 已配置为允许远程连接. (provider ... 
- eclipse中svn项目重定向地址
			有这种需求,一般是把项目提交到IP地址已经跟换的服务器,无法连接服务器再提交项目,比较着急. 我们看看怎么办: ② ③ 
- this  指向  及 调用方式
			1. this 指向 函数执行方式 this指向1.直接圆括号 window2.对象调用 对象3.事件触发 触发对象4.定时器运行 window (常常定义变量存储this以达到this指向特定对象) ... 
- php 建站  多域名配置  自定义重定向
			1. 申请一个域名 , 当多个域名使用. 比如 申请一个顶级域名为 .com 后缀的一级域名 :mine.com, 一般允许绑定四五个二级域名,比如 www.mine.com . mine.mine ... 
- 学习笔记18—circos应用集
			一.在线画图(行列分别最大为75) 相信大家都听说过circos图,但是亲自画过的人可能就很少,这主要因为软件的安装和使用稍微有一点麻烦.其实,circos图也是可以在线绘制的,这样就简单多了!一起来 ... 
