转载:Hive开窗函数总结

Hive系列 (三):开窗函数详解 开窗函数详细介绍,包括聚合开窗函数和排序开窗函数,sum,min,max,avg,first_value,last_value,lag,lead,cume_dist,row_number,rank,dense_rank,percent_rank,ntile等函数 阅读详情

转载:Hive开窗函数总结
https://blog.youkuaiyun.com/Abysscarry/article/details/81408265
背景:
平常我们使用 hive或者 mysql时,一般聚合函数用的比较多。但对于某些偏分析的需求,group by可能很费力,子查询很多,这个时候就需要使用窗口分析函数了~
注:hive、oracle提供开窗函数,mysql8之前版本不提供,但Oracle发布的 MySQL 8.0版本支持窗口函数(over)和公用表表达式(with)这两个重要的功能!

版本:Hive 1.1.0 + cdh5.13.0

一、介绍
分析函数用于计算基于组的某种聚合值,它和聚合函数的不同之处是:对于每个组返回多行,而聚合函数对于每个组只返回一行。

开窗函数指定了分析函数工作的数据窗口大小,这个数据窗口大小可能会随着行的变化而变化!到底什么是数据窗口?后面举例会详细讲到!

  1. 基础结构:

分析函数(如:sum(),max(),row_number()…) + 窗口子句(over函数)
1
2. over函数写法:
  over(partition by cookieid order by createtime) 先根据cookieid字段分区,相同的cookieid分为一区,每个分区内根据createtime字段排序(默认升序)
  
注:不加 partition by 的话则把整个数据集当作一个分区,不加 order by的话会对某些函数统计结果产生影响,如sum()

  1. 测试数据:

测试表test1只有三个字段 cookieid、createtime、pv

  1. 窗口含义:

SELECT cookieid,createtime,pv,
SUM(pv) OVER(PARTITION BY cookieid ORDER BY createtime) AS pv1, – 默认为从起点到当前行
SUM(pv) OVER(PARTITION BY cookieid ORDER BY createtime ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS pv2, --从起点到当前行,结果同pv1
SUM(pv) OVER(PARTITION BY cookieid ORDER BY createtime ROWS BETWEEN 3 PRECEDING AND CURRENT ROW) AS pv3, --当前行+往前3行
SUM(pv) OVER(PARTITION BY cookieid ORDER BY createtime ROWS BETWEEN 3 PRECEDING AND 1 FOLLOWING) AS pv4, --当前行+往前3行+往后1行
SUM(pv) OVER(PARTITION BY cookieid ORDER BY createtime ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) AS pv5 —当前行+往后所有行
FROM test1;
1
2
3
4
5
6
7
结果:

cookieid createtime pv pv1 pv2 pv3 pv4 pv5
a 2017-12-01 3 3 3 3 3 3
b 2017-12-00 3 3 3 3 3 3
cookie1 2017-12-10 1 1 1 1 6 26
cookie1 2017-12-11 5 6 6 6 13 25
cookie1 2017-12-12 7 13 13 13 16 20
cookie1 2017-12-13 3 16 16 16 18 13
cookie1 2017-12-14 2 18 18 17 21 10
cookie1 2017-12-15 4 22 22 16 20 8
cookie1 2017-12-16 4 26 26 13 13 4
cookie2 2017-12-12 7 7 7 7 13 14
cookie2 2017-12-16 6 13 13 13 14 7
cookie2 2017-12-24 1 14 14 14 14 1
cookie3 2017-12-22 5 5 5 5 5 5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
注:这些窗口的划分都是在分区内部!超过分区大小就无效了

相信大家看了后就会明白,如果不指定ROWS BETWEEN,默认统计窗口为从起点到当前行;如果不指定ORDER BY,则将分组内所有值累加;

关键是理解 ROWS BETWEEN 含义,也叫做window子句:
PRECEDING:往前
FOLLOWING:往后
CURRENT ROW:当前行
UNBOUNDED:无边界,UNBOUNDED PRECEDING 表示从最前面的起点开始, UNBOUNDED FOLLOWING:表示到最后面的终点
–其他AVG,MIN,MAX,和SUM用法一样

二、SUM 函数
select cookieid,createtime,pv,
sum(pv) over(PARTITION BY cookieid ORDER BY createtime) as pv1
FROM test1
1
2
3

首先 PARTITION BY cookieid,根据cookieid分区,各分区之间默认根据字典顺序排序,ORDER BY createtime,指定的是分区内部的排序,默认为升序

我们可以清晰地看到,窗口函数和聚合函数的不同,sum()函数可以根据每一行的窗口返回各自行对应的值,有多少行记录就有多少个sum值,而group by只能计算每一组的sum,每组只有一个值!

其中sum()计算的是分区内排序后一个个叠加的值,和order by有关!

如果不加 order by会咋样:

select cookieid,createtime,pv,
sum(pv) over(PARTITION BY cookieid) as pv1
FROM test1
1
2
3

可以看到,如果没有order by,不仅分区内没有排序,sum()计算的pv也是整个分区的pv

注:max()函数无论有没有order by 都是计算整个分区的最大值

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

注1:如果切片不均匀,默认增加第一个切片的分布
注2:NTILE不支持ROWS BETWEEN

SELECT cookieid,createtime,pv,
NTILE(2) OVER(PARTITION BY cookieid ORDER BY createtime) AS ntile1, --分组内将数据分成2片
NTILE(3) OVER(PARTITION BY cookieid ORDER BY createtime) AS ntile2, --分组内将数据分成3片
NTILE(4) OVER(PARTITION BY cookieid ORDER BY createtime) AS ntile3 --将所有数据分成4片
FROM test1
1
2
3
4
5

用法举例:
统计一个cookie,pv数最多的前1/3的天:

SELECT cookieid,createtime,pv,
NTILE(3) OVER(PARTITION BY cookieid ORDER BY pv DESC) AS ntile
FROM test1;
1
2
3
取 ntile = 1 的记录,就是我们想要的结果!

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

ROW_NUMBER() 的应用场景非常多,比如获取分组内排序第一的记录、获取一个session中的第一条refer等。

SELECT cookieid,createtime,pv,
ROW_NUMBER() OVER(PARTITION BY cookieid ORDER BY pv desc) AS rn
FROM test1;
1
2
3

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

我们把 rank、dense_rank、row_number三者对比,这样比较清晰:

SELECT cookieid,createtime,pv,
RANK() OVER(PARTITION BY cookieid ORDER BY pv desc) AS rank1,
DENSE_RANK() OVER(PARTITION BY cookieid ORDER BY pv desc) AS d_rank2,
ROW_NUMBER() OVER(PARTITION BY cookieid ORDER BY pv DESC) AS rn3
FROM test1
1
2
3
4
5

六、CUME_DIST 函数
cume_dist 返回小于等于当前值的行数/分组内总行数

比如,我们可以统计小于等于当前薪水的人数,所占总人数的比例

SELECT cookieid,createtime,pv,
round(CUME_DIST() OVER(ORDER BY pv),2) AS cd1,
round(CUME_DIST() OVER(PARTITION BY cookieid ORDER BY pv),2) AS cd2
FROM test1;
1
2
3
4

注:cd1没有partition,所有数据均为1组!

七、PERCENT_RANK 函数
percent_rank 分组内当前行的RANK值-1/分组内总行数-1

注:一般不会用到该函数,可能在一些特殊算法的实现中可以用到吧

SELECT cookieid,createtime,pv,
PERCENT_RANK() OVER(ORDER BY pv) AS rn1
from test1
1
2
3

八、LAG 和 LEAD 函数
LAG(col,n,DEFAULT) 用于统计窗口内往上第n行值

第一个参数为列名,第二个参数为往上第n行(可选,默认为1),第三个参数为默认值(当往上第n行为NULL时候,取默认值,如不指定,则为NULL)

SELECT cookieid,createtime,pv,
ROW_NUMBER() OVER(PARTITION BY cookieid ORDER BY createtime) AS rn,
LAG(createtime,1,‘1970-01-01’) OVER(PARTITION BY cookieid ORDER BY createtime) AS lag1,
LAG(createtime,2) OVER(PARTITION BY cookieid ORDER BY createtime) AS lag2
FROM test1;
1
2
3
4
5

LEAD 函数则与 LAG 相反:
LEAD(col,n,DEFAULT) 用于统计窗口内往下第n行值

第一个参数为列名,第二个参数为往下第n行(可选,默认为1),第三个参数为默认值(当往下第n行为NULL时候,取默认值,如不指定,则为NULL)

九、FIRST_VALUE 和 LAST_VALUE 函数
FIRST_VALUE 取分组内排序后,截止到当前行,第一个值

SELECT cookieid,createtime,pv,
ROW_NUMBER() OVER(PARTITION BY cookieid ORDER BY createtime) AS rn,
FIRST_VALUE(pv) OVER(PARTITION BY cookieid ORDER BY createtime) AS first
FROM test1;
1
2
3
4

LAST_VALUE 函数则相反:
LAST_VALUE 取分组内排序后,截止到当前行,最后一个值

这两个函数还是经常用到的(往往和排序配合使用),比较实用!

HIVE开窗函数 ETL,SQL面试高频考点——HIVE开窗函数 目录标题ETL,SQL面试高频考点——HIVE开窗函数一,窗口函数介绍二,开窗函数三,开窗函数分类排序开窗函数:实列解析:后续更新中~ 一,窗口函数介绍 窗口函数,也叫OLAP函数(Online Anallytical Processing,联机分析处理),可以对数据库数据进行实时分析处理。 二,开窗函数 开创函数就是定义一个行为列,简单讲,就是你查询的结果上,多出一列值(可以是聚合值或者排序号,所以开窗函数可以分为两类:聚合开窗函数和排序开窗函数,特征就是 阅读详情

相关推荐

Hive之聚合类开窗函数 + 滑动求和

Hive之聚合类开窗函数 + 滑动求和

wowulita123的博客 2066

HIVE函数汇总--开窗函数篇

详细介绍开窗函数的思路及其用法

小猿天地 1万+

大数据-Hive开窗函数

Hive开窗函数结构: xx() over(partition by xx order by xx) Hive开窗函数,大致有以下两类: 1. 排序开窗函数 row_number():组内排名后获取行号 rank():组内排名(连续) dense_rank():组内排名(跳跃) first_value() last_value() lag(col, n, default):用于统计窗口内往上取第n个值 lead(col, n, default):用于统计窗口内往下取第n个值 cume_dist(col):计

MsSpark的博客 3713

hive的开窗函数篇

hive的开窗函数over()

qq_40202995的博客 1万+

Hive 开窗函数详解

1.Hive 数据存储 Hive支持的存储数的格式主要有:TEXTFILE 、SEQUENCEFILE、ORC、PARQUET。TEXTFILE和SEQUENCEFILE的存储格式都是基于行存储的;ORC和PARQUET是基于列式存储的。 1.1 列式存储和行式存储基本介绍 • 行存储的特点:查询满足条件的一整行数据的时候,列存储则需要去每个聚集的字段找到对应的每个列的值,行...

程序员学习圈 1992

QMT与通达信代码实战:从预警到交易的自动化实现

本文详细介绍了如何利用QMT量化交易平台与通达信软件实现从预警到交易的全自动化。通过读取通达信预警生成的板块文件,QMT策略可自动执行买卖指令,有效解决手动交易滞后问题。文章提供了完整的代码框架、核心原理拆解及实盘注意事项,帮助投资者构建高效、纪律性的自动化交易系统。

ansible6ops的博客 648

【Hive】窗口函数(开窗函数部分)

我们都知道在sql中有一类函数叫做聚合函数,例如sum()、avg()、max()等等,这类函数可以将多行数据按照规则聚集为一行,一般来讲聚集后的行数是要少于聚集前的行数的.但是有时我们想要既显示聚集前的数据,又要显示聚集后的数据,这时我们便引入了窗口函数.目前,我用的多的就是 row_number() , sum(), 解决topN 问题,分区排序,累积计数。hive中的窗口函数和sql中的窗口函数相类似,都是用来做一些数据分析类的工作,一般用于OLAP分析(在线分析处理)。

康师傅没有眼泪 5844

用LangFuse+LangChain打造可观测的AI应用:从埋点到成本监控实战

本文详细介绍了如何将开源可观测性平台LangFuse深度集成到基于LangChain构建的AI应用中,特别是电商客服机器人场景。通过从基础SDK集成、提示词管理到成本监控的完整实战,帮助开发者实现对LLM应用内部工作流的清晰追踪、问题排查与费用分析,从而打造稳定、可控的生产级AI应用。

dapp9builder的博客 711

Hive学习——开窗函数精讲

Hive中开窗函数十分重要,很多业务需求都可以用开窗函数解决

雷神乐乐的博客 3466

05 SAP CPI 访问第一个CPI接口

其中的clientid的值可作为Basic验证的用户名,clientsecret的值可作为Basic验证的密码。点击SEND按钮,可看见返回状态为200 OK。在04中,我们得到TOKEN令牌。POSTMAN向下滚动。点击按钮获取token。

SAP CPI 663

YOLOv11改进策略【卷积层】| 引入注意力卷积模块RFAConv,关注感受野空间特征 助力yolov11精度提升

RFAConv:创新空间注意力和标准卷积运算感受野空间特征是针对卷积核设计的,根据卷积核大小动态生成。以3×3卷积核为例,它由非重叠滑动窗口组成,每个窗口代表一个感受野滑块。

Limiiiing的博客 1823

Hive窗口函数(开窗函数)

一、相关函数说明 over():指定聚合函数工作的数据窗口的大小,这个数据窗口大小会随着行的变而变化。over跟在聚合函数后面,只对聚合函数生效。 current row:当前行 n preceding:往前n行数据 n following:往后n行数据 unbounded:起点:unbounded preceding 表示从前面的起点开始,unbounded following表示到后面的终点结束 lag(col,n):往前第n行数据 lead(col,n):往后第n行数据 ntile(n):把有

Markble 3928

【硬刚Hive】HIVE基础(20):Hive函数(9) over 窗口函数

欢迎关注博客主页:微信搜:import_bigdata,大数据领域硬核原创作者_王知无(import_bigdata)_优快云博客 欢迎点赞、收藏、留言 ,欢迎留言交流!本文由【王知无】原创,首发于 优快云博客!本文首发优快云论坛,未经过官方和本人允许,严禁转载! 本文是对《【硬刚大数据之学习路线篇】从零到大数据专家的学习指南(全面升级版)》的Hive部分补充。 hive窗口函数语法 在前言中我们已经说了avg()、sum()、max()、min()是分析函数,而over()才是窗..

微信搜:import_bigdata,大数据领域硬核原创作者 888

转载:hive开窗函数,分析函数

原始链接:https://www.cnblogs.com/yejibigdata/p/6376409.html 1.hive开窗函数,分析函数 http://yugouai.iteye.com/blog/1908121 分析函数用于计算基于组的某种聚合值,它和聚合函数的不同之处是:对于每个组返回多行,而 聚合函数对于每个组只返回一行。 开窗函数指定了分析函数工作的数据窗口大小,这个数据窗口大小可能会随着行的变化而变化 drop table if exists student; create tab.

黄道婆的专栏 349

qt实现OCC读取STEP模型并显示(附完整源码)

qt实现OCC读取STEP模型并显示(附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 1480

C++性能优化:深入理解缓存一致性与伪共享

在现代多核处理器的世界里,理解缓存一致性和伪共享就像理解一个复杂社会系统的运作规则。正如心理学家阿德勒所说:"人的行为总是有目的的",CPU缓存的每一次同步也都有其深层的硬件逻辑。本文将带你深入探索这些看不见的性能杀手,以及如何在实际项目中与它们优雅共处。

探索C++编程的奥秘,分享深入的技术见解和实践,旨在激发读者创造力与解决问题的思维。 935

转载:Hive开窗函数整理

原始链接:https://www.cnblogs.com/zz-ksw/p/12917693.html Hive开窗函数整理 分析函数用于计算基于组的某种聚合值,它和聚合函数的不同之处是:对于每个组返回多行,而聚合函数对于每个组只返回一行。 开窗函数指定了分析函数工作的数据窗口大小,这个数据窗口大小可能会随着行的变化而变化!到底什么是数据窗口?后面举例会详细讲到! 基础结构: 分析函数(如:sum(),max(),row_number()...) + 窗口子句(over函数) over函数.

黄道婆的专栏 163

直击高频编程考点:字符串知识及经典算法题总结

字符串相关基本练习题总结(最长公共子串、最长回文子串、最长无重复字符子串、最小覆盖子串、字符串相乘、中文数字表达转实际数字格式等)

曾经“等你生日那天”都遥远得像未来,如今却可欢愉的挥手说“下个十年见” 172万+

转载:Hive开窗函数实战(建议收藏)

原始链接:https://blog.youkuaiyun.com/a934079371/article/details/106205151?utm_medium=distribute.pc_relevant_t0.none-task-blog-OPENSEARCH-1.channel_param&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-OPENSEARCH-1.channel_param Hive开窗函数实战(建议收藏) .

黄道婆的专栏 266

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

转载:Hive开窗函数 Window Functions

原始链接:https://cwiki.apache.org/confluence/display/ASTERIXDB/Window+Functions Window Functions 转至元数据结尾 由Dmitry Lychagin创建, 最后修改于二月 28, 2019 转至元数据起始 Motivation User Model Design SQL++ Expression Algebricks Operator Hyracks Runtime Open items..

黄道婆的专栏 561

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

Hive 开窗函数

工作中用到了几个hive开窗函数,便想把hive开窗函数系统梳理一遍。 开窗函数 普通的聚合函数聚合的行集是组,开窗函数聚合的行集是窗口。因此,普通的聚合函数每组(Group by)只返回一个值,而开窗函数则可为窗口中的每行都返回一个值。简单理解,就是对查询的结果多出一列,这一列可以是聚合值,也可以是排序值。 开窗函数一般分为两类,聚合开窗函数和排序开窗函数。 测试数据 --...

王佩的优快云博客 6万+

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

HIVE--hive的窗口函数(开窗函数,分析函数)

本文详细介绍了hive窗口函数,即包括开窗函数和分析函数两部分。

数据科学 爱好分享 快乐就完了 1万+

Hive 开窗函数 汇总

近期用开窗函数比较多老是用不好 ,这里做一下汇总

薛秋艳的博客 5047

hive中的开窗函数

目录count开窗函数sum开窗函数min开窗函数max开窗函数avg开窗函数first_value开窗函数last_value开窗函数lag开窗函数、lead开窗函数cume_dist开窗函数排序开窗函数rank开窗函数dense_rank开窗函数ntile开窗函数row_number开窗函数percent_rank开窗函数 最近遇到了hive开窗函数的工作,并且面试时很有可能会问到hive的...

fuyun6363的博客 2066

hive的开窗函数

hive的开窗函数 开窗函数可用于组内数据分析排序。 开窗函数的语法 Function (arg1,..., argn) OVER ([PARTITION BY <...>] [ORDER BY <....>] [<window_expression>]) hive常用的开窗函数Function : -- 聚合开窗函数 count(); -- 窗口内总条数 sum(); -- 窗口内数据的和 min(); -- 窗口内最小值 max(); -- 窗口内最

Climber 6094

Hive 的开窗函数有哪些?

开窗函数是一类特殊的 SQL 函数,它能够在查询结果的某个窗口内进行计算。与传统的聚合函数不同,开窗函数不会将结果集缩减到单一的行,而是保留所有行,同时在每一行上进行计算。开窗函数通常用于分析、排名及计算移动平均等场景。:开窗函数的名称。argument:函数的参数。:定义窗口的分区。ORDER BY:定义窗口内的排序。Hive 的开窗函数为数据分析提供了强大的功能,使得用户能够在不聚合数据的情况下对数据进行细致的分析。通过使用各种开窗函数(如RANK()SUM()LEAD()和LAG()

My_wife_QBL的博客 1499
上一篇: HIVE相关问题
下一篇: 数据单位:概况容量 Byte、KB、MB、GB、TB、PB、EB、ZB、YB、NB、DB、CB、XB
星辰_218
博客等级 码龄7年 18粉丝 14原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值