首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >大数据快速入门(10):Hive窗口函数

大数据快速入门(10):Hive窗口函数

作者头像
kk大数据
发布于 2020-11-11 05:01:24
发布于 2020-11-11 05:01:24
2.9K00
代码可运行
举报
文章被收录于专栏:kk大数据kk大数据
运行总次数:0
代码可运行

一、窗口函数的概念

首先,需要认识到,窗口函数并不是只有 hive 才有的,SQL 语法标准中,就有窗口函数。

并且 mysql,oracle等数据库都实现了窗口函数。

而 hive 自带的窗口函数功能,则是对原有 hive sql 语法的补充和加强。

那么什么时候,会用到窗口函数?

举两个小栗子:

  • 排名问题:每个部门按业绩排名
  • topN 问题:找出每个部门排名前 N 的员工进行奖励

面对这类需求,就需要使用窗口函数了。

窗口函数的基本语法如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<窗口函数> over (partition by <用于分组的列名>
                order by <用于排序的列名>)

那么语法中的窗口函数的位置,可以放以下两种函数:

1)专用窗口函数,包括后面要讲到的 rank,dense_rank,row_number 等专用窗口函数

2)聚合函数,如 sum,avg,count,max,min 等

因为窗口函数是对 where 或者 group by 子句处理后的结果进行操作,所以窗口函数原则上只写在 select 子句中。

二、实战窗口函数

我们以一个用户月消费明细表,作为例子,来实战各个窗口函数的功能 首先建表

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
drop table tempon.t_user_cost;
create external table if not exists tempon.t_user_cost(
name string comment '用户名',
date string comment '月份',
cost int comment '花费'
) comment '用户花费表' 
row format delimited fields terminated by ","
location '/tmp/person_cost'

数据为:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
jack,2015-01-01,10
tony,2015-01-02,15
jack,2015-02-03,23
tony,2015-01-04,29
jack,2015-01-05,46
jack,2015-04-06,42
tony,2015-01-07,50
jack,2015-01-08,55
mart,2015-04-08,62
mart,2015-04-09,68
neil,2015-05-10,12
mart,2015-04-11,75
neil,2015-06-12,80
mart,2015-04-13,94

1、over 关键字的理解

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select name,count(1) over() 
from tempon.t_user_cost

这里的 over() 中既没有 partition by,也没有 order by,表示不分区(自然也不排序),也就是把全局数据分一个区,结果输出到每一行上。

可以看到运行结果中,还是 14 行,并且每行都有一个统计值。

聚合函数是会缩减行数的,而窗口函数则不会,就可以直观看到,截止到本行数据,统计结果是多少。

2、partition by 子句

也叫查询分区子句,将数据按照边界值分组,而over()之前的函数在每个分组内执行。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select name,
       date,
       cost,
sum(cost) over(partition by month(date)) 
from tempon.t_user_cost;

可以看到,数据是对月份(month(date))来分区的,并且对于每个月都统计了 sum(cost) 值。(由于没有 order by 子句,sum 函数是对于所有数据的累加)。

3、order by 子句

order by 子句,是对某一个字段分区,对分区内的另一个字段进行排序。

排好序后,对于不同的聚合函数效果不一样。

  • 如果和 sum 函数一起使用,就是按照排序,逐行累加
  • 如果和 count 函数一起使用,就是按照排序,计数累加
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select name,
       date,
       cost,
       sum(cost) over(partition by month(date) order by cost) 
from tempon.t_user_cost;

和 count 函数一起使用,则是逐行计数累加

4、window子句

(不同的窗口互不影响,自己算自己的)

window是为了更加细粒度的划分

如果只使用了partition by子句,未指定order by的话,我们的聚合是分组内的聚合;

如果使用了order by子句,未使用window子句,默认从起点到当前行;

如果使用了下面的语法,那么当前行可以随意指定统计规则

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
rows between keyword1 and keyword2
  • 当前行:current row
  • 往前n行:n preceding
  • 往后n行:n following
  • 往前无限行:unbouded preceding
  • 往后无限行:unbouded following

如下面的 SQL

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select name,date,cost,
sum(cost) over() sample1,  -- 所有行累加
sum(cost) over(partition by name) sample2, -- 按照name相加
sum(cost) over(partition by name order by cost) sample3, --按照name累加
sum(cost) over(partition by name order by cost rows between unbounded preceding and current row) sample4, --和sample3一样的效果
sum(cost) over(partition by name order by cost rows between 1 preceding and current row) sample5, -- 当前行和上一行相加
sum(cost) over(partition by name order by cost rows between 1 preceding and 1 following) sample6, -- 上一行、当前行、后一行相加
sum(cost) over(partition by name order by cost rows between current row and unbounded following) sample7 -- 当前行到末尾
from tempon.t_user_cost;

5、row_number() 和 rank() 和 dense_rank()

这三个函数是为了排序,但是有区别

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select name,
       date,
       cost,
       row_number() over(partition by name order by cost),
       rank()       over(partition by name order by cost),
       dense_rank() over(partition by name order by cost)
  from tempon.t_user_cost;

row_number() 是无脑排序

rank() 是相同的值排名相同,相同值之后的排名会继续加,是我们正常认知的排名,比如学生成绩。

dense_rank()也是相同的值排名相同,接下来的排名不会加。不会占据排名的坑位。

6、lag函数 和 lead函数

lag()函数是在窗口内,在指定列上,取上N行的数据,并且有默认值。没有设置默认值的话,为null

lag(dt,1,'1990-01-01') 就是在窗口分区内,往上取 1 行的数据,填到本行中。如果是第一行,则取 1990-01-01

lead(dt,1,'1990-01-01') 就是在窗口分区内,往下取1行的数据,填到本行中。如果是第一行,则取 1990-01-01

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select name,date,cost,
  lag(date,1,'1990-01-01') over(partition by name order by date),
  lag(date,2,'1990-01-01') over(partition by name order by date),
  lead(date,1,'1990-01-01') over(partition by name order by date)
    from tempon.t_user_cost

第一个参数是列名,第二个参数是取上多少行的数据,第三个参数是默认值

7、first_value() 和 last_value()

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select name,
         date,
         cost,
         first_value(date) over(partition by name order by date),
         last_value(date) over(partition by name order by date)
    from tempon.t_user_cost;

当前分区的第一个值和最后一个值

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-11-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 KK架构 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
HarmonyOS应用开发者高级认证(88分答案)
D. 取消订阅公共事件 2端云一体化工程目录结构分为哪些部分 A. 端开发工程(Application)
红目香薰
2023/10/11
22.8K0
HarmonyOS应用开发者高级认证(88分答案)
HarmonyOS应用开发——页面布局技巧
我们将对于多页面以及更多有趣的功能展开叙述,这次我们对于 HarmonyOS 的很多有趣常用组件并引出一些其他概念以及解决方案、页面跳转传值、生命周期、启动模式(UiAbility),样式的书写、状态管理以及动画等方面进行探讨
小帅聊鸿蒙
2024/06/25
4870
HarmonyOS应用开发——页面布局技巧
常见鸿蒙应用开发面试题
.markdown-body{word-break:break-word;line-height:1.75;font-weight:400;font-size:16px;overflow-x:hidden;color:#252933}.markdown-body h1,.markdown-body h2,.markdown-body h3,.markdown-body h4,.markdown-body h5,.markdown-body h6{line-height:1.5;margin-top:35px;margin-bottom:10px;padding-bottom:5px}.markdown-body h1{font-size:24px;line-height:38px;margin-bottom:5px}.markdown-body h2{font-size:22px;line-height:34px;padding-bottom:12px;border-bottom:1px solid #ececec}.markdown-body h3{font-size:20px;line-height:28px}.markdown-body h4{font-size:18px;line-height:26px}.markdown-body h5{font-size:17px;line-height:24px}.markdown-body h6{font-size:16px;line-height:24px}.markdown-body p{line-height:inherit;margin-top:22px;margin-bottom:22px}.markdown-body img{max-width:100%}.markdown-body hr{border:none;border-top:1px solid #ddd;margin-top:32px;margin-bottom:32px}.markdown-body code{word-break:break-word;border-radius:2px;overflow-x:auto;background-color:#fff5f5;color:#ff502c;font-size:.87em;padding:.065em .4em}.markdown-body code,.markdown-body pre{font-family:Menlo,Monaco,Consolas,Courier New,monospace}.markdown-body pre{overflow:auto;position:relative;line-height:1.75}.markdown-body pre>code{font-size:12px;padding:15px 12px;margin:0;word-break:normal;display:block;overflow-x:auto;color:#333;background:#f8f8f8}.markdown-body a{text-decoration:none;color:#0269c8;border-bottom:1px solid #d1e9ff}.markdown-body a:active,.markdown-body a:hover{color:#275b8c}.markdown-body table{display:inline-block!important;font-size:12px;width:auto;max-width:100%;overflow:auto;border:1px solid #f6f6f6}.markdown-body thead{background:#f6f6f6;color:#000;text-align:left}.markdown-body tr:nth-child(2n){background-color:#fcfcfc}.markdown-body td,.markdown-body th{padding:12px 7px;line-height:24px}.markdown-body td{min-width:120px}.markdown-body blockquote{color:#666;padding:1px 23px;margin:22px 0;border-left:4px solid #cbcbcb;background-color:#f8f8f8}.markdown-body blockquote:after{display:block;content:""}.markdown-body blockquote>p{margin:10px 0}.
万少
2025/03/27
2710
常见鸿蒙应用开发面试题
HarmonyOS NEXT实战:启动页
##HarmonyOS Next实战##HarmonyOS SDK应用服务##教育##
中雨
2025/06/25
610
鸿蒙开发实战:揭秘页面与项目生命周期,实现精准监控
在鸿蒙应用开发中,每一个页面和组件都承载着特定的生命周期。这些生命周期阶段,如同生命的轨迹,记录着页面从诞生到消亡的每一个重要时刻。深入理解和监控这些生命周期,不仅能提升应用性能,还能帮助我们更好地把握用户体验。
用户2475552
2025/06/29
1400
HarmonyOS学习路之方舟开发框架—学习ArkTS语言(基本语法 三)
组件生命周期,即一般用@Component装饰的自定义组件的生命周期,提供以下生命周期接口:
爱吃土豆丝的打工人
2023/10/15
7820
HarmonyOS学习路之方舟开发框架—学习ArkTS语言(基本语法 三)
【HarmonyOS 5】鸿蒙页面和组件生命周期函数
在 ArkUI 中,页面组件指的是被@Entry装饰的组件,其拥有独特的生命周期接口,这些接口对页面在不同状态下的行为控制起着关键作用。
GeorgeGcs
2025/05/08
2660
HarmonyOS NEXT-Flutter混合开发之鸿蒙-代码实践
在 Flutter 三端分离模式下完成纯血鸿蒙混入的过程中,虽然官方文档提供了一定的指导,但实际操作中可能会遇到一些坑。以下是我在适配过程中的一些经验总结,供各位开发者参考 😄 如果有帮助点个赞。
用户8181473
2025/03/17
4110
软x、中x、城x、翼x、拓x、华xxOD2月鸿蒙面试核心汇总
录音可以通过AVRecorder和AudioCapturer来实现。两者区别主要在支持录制声音的格式不同和控制录音文件的细小粒度不同上。AVRecorder会简单一些,AudioCapturer会复杂一些-还可以搭配ai语音功能使用
万少
2025/02/18
2060
软x、中x、城x、翼x、拓x、华xxOD2月鸿蒙面试核心汇总
Flutter鸿蒙终端一体化-天下一统
但更多的时候,我们需要的是一种类似FlutterFragment的方式来进行引用,可喜的是,鸿蒙实现这种方式也并不复杂,因为不论是FlutterPage,还是FlutterFragment,它内部实际上是通过FlutterView的方式来创建的,所以,很快就有开发者提了PR,让鸿蒙可以支持FlutterFragment的方式进行开发,这个组件就是——FlutterEntry,原始PR地址如下。 https://gitee.com/openharmony-sig/flutter_engine/pulls/116
用户1907613
2024/03/18
4440
Flutter鸿蒙终端一体化-天下一统
HarmonyOS-ArkTS-UIAbility生命周期——【坚果派-红目香薰】
浏览、切换和退出应用时,应用中UlAbility实例会在其生命周期的不同状态之间转换。
红目香薰
2024/01/25
5520
HarmonyOS-ArkTS-UIAbility生命周期——【坚果派-红目香薰】
鸿蒙自定义组件生命周期
组件生命周期,即一般用@Component装饰的自定义组件的生命周期,提供以下生命周期接口:
龙儿筝
2024/11/19
2380
鸿蒙自定义组件生命周期
01. HarmonyOS应用开发实践与技术解析
随着华为HarmonyOS生态的不断发展,越来越多的开发者开始关注并投入到HarmonyOS应用开发中。本文将通过一个实际的项目案例,详细讲解HarmonyOS应用开发的核心技术和最佳实践,帮助开发者快速掌握HarmonyOS应用开发的要点。
全栈若城
2025/03/03
2180
01. HarmonyOS应用开发实践与技术解析
【前端转鸿蒙必看篇】:组件生命周期
不管是 react 还是 vue,我们写组件写页面的时候,通常都会使用生命周期,会在一些特别的生命周期函数里,只写一个必要的逻辑,比如 componentDidMount 执行一些 sdk 的初始化,或者数据的初始化请求,componentWillUnMount 里进行一些定时器的清楚。在 ArkUI 里也有类似的生命周期;
小帅聊鸿蒙
2024/10/30
3450
【前端转鸿蒙必看篇】:组件生命周期
HarmonyOS应用开发——程序框架UIAbility、启动模式与路由跳转
先看下通过应用程序框架UIAbility、启动模式和路由参数跳转,我们实现的简单Demo效果图:
小帅聊鸿蒙
2024/06/18
9700
HarmonyOS应用开发——程序框架UIAbility、启动模式与路由跳转
HarmonyOS Next 自定义组件@Component的生命周期
用户4773577
2025/06/27
720
【鸿蒙基于API 13实战开发】—— ArkUI 组件:Router切换Navigation
从ArkUI组件树层级上来看,原先由Router管理的page在页面栈管理节点stage的下面。Navigation作为导航容器组件,可以挂载在单个page节点下,也可以叠加、嵌套。Navigation管理了标题栏、内容区和工具栏,内容区用于显示用户自定义页面的内容,并支持页面的路由能力。Navigation的这种设计上有如下优势:
小帅聊鸿蒙
2025/01/17
2240
【鸿蒙基于API 13实战开发】—— ArkUI 组件:Router切换Navigation
华为HarmonyOS鸿蒙应用开发初体验
HarmonyOS鸿蒙系统出来好几年了,开发鸿蒙应用和咱平时的前端开发到底有什么差别呢,下面就从一个前端开发的视角带领大家体验一下HarmonyOS开发。
人人都是码农
2023/11/15
1K0
华为HarmonyOS鸿蒙应用开发初体验
遥遥领先!HarmonyOS ArkTS页面和自定义组件生命周期
上一篇文章我们介绍了 《遥遥领先! HarmonyOS 自定义组件的结构、函数、变量、参数规定,这篇太干了我要渴死了!!!》 现在我们系统的看看 ArkTS页面和自定义组件生命周期 的实现流程步骤
杨不易呀
2023/12/05
1K0
遥遥领先!HarmonyOS ArkTS页面和自定义组件生命周期
HarmonyOS NEXT 实战系列09-生命周期
aboutToAppear:组件即将出现时回调该接口,具体时机为在创建自定义组件的新实例后,在执行其build()函数之前执行
用户8181473
2025/03/17
1320
推荐阅读
相关推荐
HarmonyOS应用开发者高级认证(88分答案)
更多 >
LV.3
Server后端 & 爬虫 & IT & DBA
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档