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.rhkb.cn/news/220433.html

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

相关文章

Cockpit upload文件上传漏洞(CVE-2023-1313)

0x01 产品简介 Cockpit 是一个自托管、灵活且用户友好的无头内容平台,用于创建自定义数字体验。 0x02 漏洞概述 Cockpit assetsmanager/upload接口处存在文件上传漏洞,攻击者可通过该漏洞在服务器端任意上传代码,写入后门,获取服务器权限,进而控制整个web服务器。 0x0…

深入理解 hash 和 history:网页导航的基础(下)

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云…

Linux 特殊符号

目录 1. # 注释 2. ;命令分隔符 3. .. 上级目录 4. . 当前目录 5. " " 换行,解析变量 6. 换行,不解析变量 7. \ 和 / 8. !历史命令调用,取反 9. * 通配符 10. $ 调用变量 11. | 管道 12. || …

亿发零售云引领新零售时代:智能收银系统助力连锁门店多业态发展

近来,越来越多零售从业者认识到,线上和线下全渠道整合将成为国内消费市场的主要趋势。在这个趋势中,线下门店仍然被视为品牌发展的重要价值来源。 在连锁门店中,收银系统被认为是运营管理的关键工具,能够为品牌门店提供…

MySQL数据库 DDL

目录 一、DDL 二、操作数据库 三、操作表 四、数据类型 五、表操作案例 六、修改表 七、删除表 一、DDL Data Definition Language,数据定义语言,用来定义数据库对象(数据库,表,字段) 。 二、操作数据库 (1&am…

ControlNet Adding Conditional Control to Text-to-Image Diffusion Models

ControlNet: Adding Conditional Control to Text-to-Image Diffusion Models TL; DR:ControlNet 使得我们能通过输入额外的条件图(如 Canny 边缘、人体姿态、深度图等),对 SD 生成结果的空间位置有更准确的控制。它拷贝 SD 部分…

基于Springboot的旅游网站设计与实现(论文+调试+源码)

项目描述 临近学期结束,还是毕业设计,你还在做java程序网络编程,期末作业,老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。这里根据疫情当下,你想解决的问…

Golang清晰代码指南

发挥易读和易维护软件的好处 - 第一部分 嗨,开发者们,清晰的代码是指编写易于阅读、理解和维护的软件代码。它是遵循一组原则和实践,优先考虑清晰性、简单性和一致性的代码。清晰的代码旨在使代码库更易管理,减少引入错误的可能性…

【老牌期刊】IF:6+,2天预审,3-5个月录用!

期刊简介 1区计算机智能类SCI 【期刊概况】IF:6.0-7.0,JCR1区,中科院2区; 【终审周期】走期刊部系统,3个月左右录用; 【检索情况】SCI检索; 【WOS收录年份】2018年; 【自引率】…

记录一下github深度学习的错误

1.[visdom]无法正常启动服务问题解决 在Anaconda命令窗口中: 使用python -m visdom.server启动visdom服务时,卡在: Checking for scripts. Downloading scripts, this may take a little while 无法下载和启动服务。 ERROR:由…

如何将门脸图片文字识别为excel表格数据?

对于市场调查人员而言,最烦的事莫过于对路边的小店进行逐一记录了,有没有效率高点的办法,不用人工录入呢?我来告诉你一个秘密:先将小店的牌子(门脸)拍下来,然后用OCR软件批量转成exc…

【数据结构】模式匹配之KMP算法与Bug日志—C/C++实现

​🌈个人主页:Sarapines Programmer🔥 系列专栏:《数据结构奇遇记》🔖墨香寄清辞:墨痕寄壮志,星辰梦未满。 通幽径心凝意,剑指苍穹势如山。 目录 🌞1. 模式匹配的基本概念…

Ubuntu 常用命令之 sed 命令用法介绍

sed是一个在Linux和其他Unix-like系统中常用的流编辑器,用于对输入流(文件或管道)进行基本的文本转换。它可以非常方便地进行文本替换、插入、删除等操作。 sed命令的基本格式为 sed [options] command file(s)其中,常用的参数有…

【Python】—— pandas数据处理

Pandas 提供了丰富的数据处理功能,涵盖了从数据导入、清理、转换到分析和可视化的方方面面。以下是一份关于 Pandas 数据处理的主要内容: 1. 数据导入和导出 导入数据: import pandas as pd# 从 CSV 文件导入 df pd.read_csv(data.csv)# 从…

git 常见错误总结(会不断更新中。。)

常见错误 1. 配置部署key后git clone还是拉不下代码 执行以下命令 先添加 SSH 密钥到 SSH 代理: 如果你使用 SSH 代理(例如 ssh-agent),将生成的私钥添加到代理中。 ssh-add ~/.ssh/gstplatrontend/id_rsa如果报错以下错误信息…

邮件营销:定义、优势与策略指南

什么是邮件营销?跨境电商或者出海企业可能会经常使用它,它是传统的营销方式之一,在上世纪80年年代得以运用。 邮件营销,英文全称为Email Direct Marketing,缩写为EDM。它是指在收件人许可的情况下,通过电子…

持续集成交付CICD:基于 GitLabCI 与 JenkinsCD 实现后端项目发布

目录 一、实验 1. GitLabCI环境设置 2.优化GitLabCI共享库代码 3.JenkinsCD 发布后端项目 4.再次优化GitLabCI共享库代码 5.JenkinsCD 再次发布后端项目 一、实验 1. GitLabCI环境设置 (1)GitLab给后端项目添加CI配置路径 (2&#xf…

如何实现公网访问本地内网搭建的WBO白板远程协作办公【内网穿透】

最近,我发现了一个超级强大的人工智能学习网站。它以通俗易懂的方式呈现复杂的概念,而且内容风趣幽默。我觉得它对大家可能会有所帮助,所以我在此分享。点击这里跳转到网站。 文章目录 前言1. 部署WBO白板2. 本地访问WBO白板3. Linux 安装cp…

Java小案例-SpringBoot火车票订票购票票务系统

目录 前言 详细资料 源码获取 前言 SpringBoot火车票订票购票票务系统 前端使用技术:HTML5,CSS3、JavaScript、VUE等 后端使用技术:Spring boot(SSM)等 数据库:Mysql数据库 数据库管理工具:phpstud…

CSS

一,盒子模型: 1,border: (1 border-width: 5px; (2 border-style: solid;实线 dotted :  点线。dashed :  虚线。solid :  实线边框 (3 border-color: aqua; 简写:border&a…