博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
(十)Hive分析窗口函数(二) NTILE,ROW_NUMBER,RANK,DENSE_RANK
阅读量:4563 次
发布时间:2019-06-08

本文共 2173 字,大约阅读时间需要 7 分钟。

概述

本文中介绍前几个序列函数,NTILE,ROW_NUMBER,RANK,DENSE_RANK,下面会一一解释各自的用途。

注意: 序列函数不支持WINDOW子句。(ROWS BETWEEN

 

数据准备

 

数据格式

cookie1,2015-04-10,1cookie1,2015-04-11,5cookie1,2015-04-12,7cookie1,2015-04-13,3cookie1,2015-04-14,2cookie1,2015-04-15,4cookie1,2015-04-16,4cookie2,2015-04-10,2cookie2,2015-04-11,3cookie2,2015-04-12,5cookie2,2015-04-13,6cookie2,2015-04-14,3cookie2,2015-04-15,9cookie2,2015-04-16,7

 

 

创建表

use cookie;drop table if exists cookie2;create table cookie2(cookieid string, createtime string, pv int) row format delimited fields terminated by ',';load data local inpath "/home/hadoop/cookie2.txt" into table cookie2;select * from cookie2;

 

玩一玩NTILE

 

说明

NTILE(n),用于将分组数据按照顺序切分成n片,返回当前切片值

NTILE不支持ROWS BETWEEN,比如 NTILE(2) OVER(PARTITION BY cookieid ORDER BY createtime ROWS BETWEEN 3 PRECEDING AND CURRENT ROW)
如果切片不均匀,默认增加第一个切片的分布

 

查询语句

select  cookieid,  createtime,  pv,  ntile(2) over (partition by cookieid order by createtime) as rn1, --分组内将数据分成2片  ntile(3) over (partition by cookieid order by createtime) as rn2, --分组内将数据分成2片  ntile(4) over (order by createtime) as rn3 --将所有数据分成4片from cookie.cookie2 order by cookieid,createtime;

 

 

查询结果

 

 

比如,统计一个cookie,pv数最多的前1/3的天

查询语句

select  cookieid,  createtime,  pv,  ntile(3) over (partition by cookieid order by pv desc ) as rn from cookie.cookie2;

查询结果

--rn = 1 的记录,就是我们想要的结果

 

玩一玩ROW_NUMBER

 

说明

ROW_NUMBER() –从1开始,按照顺序,生成分组内记录的序列

–比如,按照pv降序排列,生成分组内每天的pv名次
ROW_NUMBER() 的应用场景非常多,再比如,获取分组内排序第一的记录;获取一个session中的第一条refer等。

 

 

分组排序

select  cookieid,  createtime,  pv,  row_number() over (partition by cookieid order by pv desc) as rnfrom cookie.cookie2;

 

 

查询结果

-- 所以如果需要取每一组的前3名,只需要rn<=3即可,适合TopN

 

玩一玩RANK 和 DENSE_RANK

—RANK() 生成数据项在分组中的排名,排名相等会在名次中留下空位

—DENSE_RANK() 生成数据项在分组中的排名,排名相等会在名次中不会留下空位

 

查询语句

select  cookieid,  createtime,  pv,  rank() over (partition by cookieid order by pv desc) as rn1,  dense_rank() over (partition by cookieid order by pv desc) as rn2,  row_number() over (partition by cookieid order by pv desc) as rn3from cookie.cookie2 where cookieid='cookie1';

 

 

查询结果

 

 

ROW_NUMBER、RANK和DENSE_RANK的区别

row_number: 按顺序编号,不留空位

rank: 按顺序编号,相同的值编相同号,留空位
dense_rank: 按顺序编号,相同的值编相同的号,不留空位

 

转载于:https://www.cnblogs.com/h-kang/p/10916753.html

你可能感兴趣的文章
Sizzle前奏
查看>>
Paint Chain HDU - 3980(sg)
查看>>
Chales常用操作
查看>>
C++ 运算符重载<<
查看>>
windows镜像
查看>>
Flask 模板语法
查看>>
ZOJ FatMouse' Trade 贪心
查看>>
音乐播放器
查看>>
SQL COOKBOOK (Ch.1-10)
查看>>
创建数组
查看>>
dict使用
查看>>
[转] 移动平台Html5的viewport使用经验
查看>>
ASP.NET MVC的帮助类HtmlHelper和UrlHelper
查看>>
《Python数据科学手册》第五章机器学习的笔记
查看>>
ubuntu16.04 配置爬虫环境
查看>>
Centos7,PHP7安装swoole
查看>>
02_ListActive中响应事件 并LogCat输出
查看>>
doubleclick adx note
查看>>
Celery框架
查看>>
[c#]asp.net开发微信公众平台(4)关注事件、用户记录、回复文本消息
查看>>