HIVE窗口函数

什么是窗口函数

hive中开窗函数通过over关键字声明;窗口函数,准确地说,函数在窗口中的应用;比如sum函数不仅可在group by后聚合,在可在窗口中应用;

hive中groupby算子和开窗over,shuffle的逻辑都是一样的;map时生成键值对,key在groupby中是group by 后跟的字段,在over 中是partition by后跟的字段;

select group_name,sum(sales) as sum_sales from dw_sec_saler_info group by group_name 中分组(key)字段是group_name

select group_name,id,sum(sales) over(partition by group_name) as sum_sales from dw_sec_saler_info 分组(key)字段也是group_name;如果开窗没有指定partition by 窗口,则函数是对全局数据应用;

与groupby不同的是,groupby每个key返回一条记录,而开窗函数,在开窗之前数据有多少行返回多少行;类似于在窗口中对每行数据应用了一个map函数,map函数传入的是指定窗口的数据,返回窗口函数计算的值;

一个select子句中,如果有多个开窗函数,尽管函数不同,倘若开窗分组字段是一样的(partition by字段是一样的),这几个开窗函数在逻辑计划可能是由一个mr实现的,因为shuffle的key是一样的;

比如:partition by 的字段都是class

select name,class  -- 班级,english_score  -- 英语成绩,math_score  -- 数学成绩,row_number() over(order by english_score+math_score) as total_rank  -- 总排名,该窗口由一个mr完成,row_number() over(partiton by class order by english_score) as english_class_rank  -- 班级中英语排名,row_number() over(partiton by class order by math_score) as english_class_rank   -- 班级中数学排名
from dw_cus_class_score_info

以上sql,通常由两个mr完成;一个mr完成class开窗逻辑,计算english_class_rankenglish_class_rank,另外一个mr计算total_rank ;具体看执行计划;


开窗函数应用

语法:函数 + over( [partition by …] [order by …] [窗口子句] )

over:开窗关键字

partition by:声明窗口划分依据,把partition by后字段相同的数据划到同一个窗口;如果没有指定分组字段,则是对全局数据应用函数;

order by:排序字段;需要注意的是,没有指定该关键字,每次返回排序可能不一样;

窗口子句:可以进一步限定范围;语法:(rows | range) between ... and ...

row就行的相对位置,range 表示的是值, 表示比这个值小n的行,比这个值大n的行即range between 是以当前值为锚点进行计算

如果指定窗口,则是窗口所有数据;等价于rows between unbounded preceding and unbounded following

(rows | range) between (unbounded | [num]) preceding and ([num] preceding | current row | (unbounded | [num]) following

(rows | range) between current row and (current row | (unbounded | [num]) following)

(rows | range) between [num] following and (unbounded | [num]) following

其中:
unbounded preceding:组内第一行数据
n preceding:组内当前行的前n行数据
current row:当前行数据
n following:组内当前行的后n行数据
unbounded following:组内后一行数据

在这里插入图片描述
图片转自:https://zhuanlan.zhihu.com/p/401242504

比如各个小组按日期升序排列对销售额累计求和:

select sales,dt,group_name,sum(sales) over(partition by group_name   -- 窗口分组字段是group_nameorder by dt asc     -- 按日期升序排列rows between unbounded preceding and current_now   -- 窗口是第一行到当前行) as consum_sales
from table_name 

常用窗口函数

1. 排名函数

  • row_number
    连续不重复排序,比如:1,2,3,4,5
  • rank
    重复跨越排序,如果两个数据是一样的,排名是一样的;比如:1,2,3,3,5;有两个3,占了两个位置,所以下一个排序是5
  • desne_rank
    重复连续排序,如果两个数据是一样的,排名是一样的,但下一个排名数字是紧挨着上一个排名,比如:1,2,3,3,4

2. 聚合计算函数

  • sum
    求和
  • avg
    平均数
  • count
    计数
  • max/min
    最大/最小值

3. 序列函数

  • lag
    返回当前数据行的上一行数据
  • lead
    返回当前数据行的下一行数据
  • first_value
    取分组内排序后,截止到当前行,第一个值
  • last_value
    分组内排序后,截止到当前行,后一个值
  • ntile
    将分组的数据按照顺序切分成n片,返回当前切片值

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/284479.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用DTS将自建MySQL迁移至PolarDB MySQL引擎,探索DTS全量数据校验

1. 领取免费的ECS和PolarDB资源 一旦您注册了阿里云账号并填写了您的账号和支付信息,您就可以申请免费试用我们的产品(如ECS、PolarDB、RDS等服务)。 1.1. 申请 ECS 免费试用 1. 在 阿里云免费试用中心,找到ECS,单击…

【数据结构】八大排序之简单选择排序算法

🦄个人主页:修修修也 🎏所属专栏:数据结构 ⚙️操作环境:Visual Studio 2022 目录 一.简单选择排序简介及思路 二.简单选择排序的代码实现 三.简单选择排序的优化 四.简单选择排序的时间复杂度分析 结语 一.简单选择排序简介及思路 简单选择排序算法…

力扣225. 用队列实现栈【附进阶版】

文章目录 力扣225. 用队列实现栈示例思路及其实现两个队列模拟栈一个队列模拟栈 力扣225. 用队列实现栈 示例 思路及其实现 两个队列模拟栈 队列是先进先出的规则,把一个队列中的数据导入另一个队列中,数据的顺序并没有变,并没有变成先进后…

羊大师之冷天喝羊的好处大揭秘!

最近,冷天喝羊已经成为了一种趋势,受到了越来越多人的关注与喜爱。你可能会好奇,为什么冷天喝羊有那么多的好处呢?今天小编羊大师将带大家一起探索这个问题,揭秘冷天喝羊带来的种种益处。 冷天喝羊对于保持身体温暖是…

pr-卡点

目录 自定义创建序列关闭拉动时音频 自定义创建序列 关闭拉动时音频 难点:寻找精准衔接画面

Transformer Decoder的输入

大部分引用参考了既安的https://www.zhihu.com/question/337886108/answer/893002189这篇文章,个人认为写的很清晰,此外补充了一些自己的笔记。 弄清楚Decoder的输入输出,关键在于图示三个箭头的位置: 以翻译为例: 输…

算法分析与设计课后练习25

问题描述 用LC分枝限界算法求解下面的0-1背包问题,并画出 所生成的状态空间树。 ① N 5, M12, (p1, p2, …, p5) (10, 15, 6, 8, 4), (w1, w2, …, w5) (4, 6, 3, 4, 2) 。 用FIFO分枝限界算法求解下面的0-1背包问题,并画 出所生成的状态空间树。 ②…

Peter算法小课堂—简单建模(4)

太戈编程1655题 一条直线上,你安排了n个哨兵站岗放哨,编号从1到n。其中i号哨兵的坐标位置是x[i]。不会有哨兵站在相同的位置。作为指挥官,你需要知道3个信息: 1.从左到右,每个哨兵的坐标依次是几? 2.从左到右&…

[ 8 种有效方法] 如何在没有备份的情况下恢复 Android 上永久删除的照片?

我们生命中最重要的时刻,但这样做有缺点,其中之一就是数据丢失的风险。您可能倾向于定期删除无意义的照片,同时保存可爱的照片,从而使您的 Android 设备井井有条。然而,有些人在删除自己珍视的图像时不小心犯了错误。您…

VMware----基于 VMware 玩转 CentOS 虚拟机创建、克隆以及配置后台运行

查看原文 文章目录 一、安装 Vmware二、创建 CentOS7 系统的虚拟机三、克隆虚拟机四、设置虚拟机后台运行 一、安装 Vmware (1)打开VMware下载地址页面,滑动页面,找到如下界面,点击【下载】 (2&#xff…

NPM的介绍和使用

初识npm npm是Node.js世界里最流行的包管理器,用于Node模块的发布、安装和管理。npm是Node Package Manager(Node包管理器)的缩写。 利用npm可以非常方便地安装各种第三方包,不需要关心包之间的各种依赖关系,因为npm会自动处理这些繁琐的工作。这极大地简化了项目的配置,使我们…

windows10-tdengine的安装及使用

win10-tdengine的安装及使用 一、下载及安装配置1.1 下载安装1.2 配置1.3 关闭防火墙和开放端口1.3.1 关闭防火墙1.3.2 开放6030端口 二、启动及关闭服务2.1 启动tdengine服务2.2 关闭tdengine服务2.2 开机自启动配置 四、可视化工具五、TDengine 命令行(CLI&#x…