Hive sql - 常用窗口函数(万字超详解)

如题所述

第1个回答  2024-08-16
Hello~我是高月!我将会在这篇文章中为你详细介绍 Hive sql 中常用的窗口函数。

窗口函数是指在特定的数据滑动窗口内,执行各种统计分析的操作。

在日常使用中,窗口函数通常与分析函数或专用窗口函数结合使用,形成如窗口聚合函数、窗口排序函数等实用函数。

具体使用语法如下:

1.1 什么是分析函数和专用窗口函数?
常用的分析函数包括:sum()、max()、min()、avg()、count()等。
专用窗口函数有:row_number()、rank()、dense_rank()等。

1.2 什么是窗口函数?
窗口函数由三个部分组成,可以单独使用,也可以混合使用,也可以全都不用。以下是语法拆解:

对指定的字段进行分组,后续操作都是以组为单位,将每个分组作为一个独立的窗口进行统计分析。

案例 01:对窗口中的数据求和,并将求和结果分配到对应窗口的每一条数据中。

案例 02:对整体数据求和,并将求和结果分配到每一条数据中。

当使用order by与partition by结合时,可以对各个分组内的数据按照指定的字段进行排序。如果没有partition by指定分组字段,则会对全局数据进行排序。

案例 01:对数据进行全局排序。

案例 02:当排序维度不存在重复时,即order by指定的字段,使用order by + 分析函数sum(),可以产生求整体累计数的效果。

但是当order by指定的字段存在重复时,在不重复的数据中会产生累计效果,而在重复的数据中,会把整体的累计结果分配到每条重复的数据中。

案例 03:当排序维度不存在重复时,即order by指定的字段,partition by与order by结合使用,并使用分析函数sum(),可以产生求窗口中累计数的效果。

但是当order by指定的字段组合存在重复时,在不重复的数据中会产生累计效果,而在重复的数据中,也会把整体的累计结果分配到每条重复的数据中。

rows between用于划分窗口中函数作用的数据范围。以下例子有助于加深rows between的理解。

rows between常用的参数如下:
① n preceding:往前
② n following:往后
③ current row:当前行
④ unbounded:起点(一般结合preceding,following使用)

使用例子如下:

rows between unbounded preceding and current row与partition by、order by结合使用,可以产生对窗口中的数据求累计数的效果。

2. 排序窗口函数
2.1 排序并产生自增编号,自增编号不重复且连续
我们可以使用函数:row_number() over()
数据样例:
具体语法如下:
案例如下:
2.2 排序并产生自增编号,自增编号会重复且不连续
我们可以使用函数:rank() over()
数据样例:
具体语法如下:
案例如下:
2.3 排序并产生自增编号,自增编号会重复且连续
我们可以使用函数:dense_rank() over()
数据样例:
具体语法如下:
案例如下:
3. 聚合窗口函数
3.1 求窗口中的累计值
我们可以使用:sum() over()
3.2 求窗口中3天的平均价格
我们可以使用 avg() over()
3.3 求分组中的最大值/最小值
3.4 求分组中的总记录数
4. 位移窗口函数
4.1 获取分组中往前n行的值
基础语法:
语法解析:
1. field 是指定的列名
2. n 是往前的行数
3. 行往前导致的最后的n行值为null,可以用default_value代替。
使用案例:
4.2 获取分组中往后n行的值
基础语法:
语法解析:
1. field 是指定的列名
2. n 是往前的行数
3. 行往后导致的,前面的n行值为null,可以用default_value代替。
使用案例:
5. 极值窗口函数
5.1 获取分组内第一行的值
我们可以使用first_value(col,true/false) over(),作用是:取分组内排序后,截止到当前行,第一个值。
注意:
案例:将每行数据换成当前窗口指定字段的第一个值
5.2 获取分组内最后一行的值
我们可以使用last_value(col,true/false) over(),作用是:取分组内排序后,截止到当前行,最后一个值。所以,如果使用order by排序时,想要取最后一个值,需要与rows between unbounded preceding and unbounded following连用。
注意:
相信大家都发现了,在本案例中,我们使用order by时与rows between unbounded preceding and unbounded following连用了,这是需要注意的一个点,如果不连用,将会产生以下效果:
6. 分箱窗口函数
ntile() over() 分箱窗口函数,用于将分组数据按照顺序切分成n片,返回当前切片值,如果切片不均匀,默认增加到第一个切片中。
案例:查询成绩前20%的人。
文章到这里就结束啦,如果喜欢这篇文章,请点赞、关注、收藏哦!
如果你有想知道的知识,欢迎评论区留言,我会持续输出相关文章内容的~

Hive sql - 常用窗口函数(万字超详解)
常用的分析函数包括:sum()、max()、min()、avg()、count()等。专用窗口函数有:row_number()、rank()、dense_rank()等。1.2 什么是窗口函数?窗口函数由三个部分组成,可以单独使用,也可以混合使用,也可以全都不用。以下是语法拆解:对指定的字段进行分组,后续操作都是以组为单位,将每个分组...

【Hive】SQL | 窗口函数详解
本文通过实例讲解Hive SQL面试中常见的窗口函数应用。假设有一个贷款表(loan),包含贷款人ID、贷款日期与金额。使用窗口函数over()可以对聚合函数如sum()、min()、max()与avg()进行分区计算。例如,第一句查询计算每个贷款人当前记录前三条贷款的总金额;第二句计算至下一笔贷款前,贷款人累计的贷款...

2万字长文,最全面的Hive开窗函数讲解和实战指南(必看)
窗口函数主要包括:聚合函数(如sum, max, min, avg等)、排序函数(如rank, row_number等)和统计比较函数(如lead, lag, first_value等)。其中,OVER子句是关键,用于指定窗口的定义。例如,PARTITION BY用于分区数据,ORDER BY用于排序,而window_expression则定义窗口的边界条件。在Hive中,窗口函数...

Hive QL窗口函数总结(2)
Hive QL窗口函数详解 窗口函数是Hive SQL中的关键特性,它允许我们在数据分组的基础上进行分析,而不是简单地对整个数据集进行汇总。窗口函数通过`over()`子句定义窗口,包括分组(partition by)、排序(order by)和窗口范围(rows)三个元素。例如,`sum`函数在窗口内计算值,而非整个分组,以便于获取每个...

Hive QL窗口函数总结(2)
此外,窗口函数还包括`RANK`、`ROW_NUMBER`和`DENSE_RANK`等排名函数,用于对数据进行排序并分配排名。`NTILE`、`CUME_DIST`和`PERCENT_RANK`函数则用于进行分组和计算累积分布。Hive还提供了增强的聚合功能,如`GROUPING SETS`、`CUBE`和`ROLLUP`,这些功能允许根据不同的维度组合进行聚合,从不同角度...

Hive SQL 大厂必考常用窗口函数及相关面试题
Hive SQL中的窗口函数在大数据处理中扮演着重要角色,尤其在面试中常被考察。窗口函数,实质上是OLAP(在线分析处理)功能的一部分,用于对数据进行实时分析,如市场分析、财务报表生成等。窗口函数区分于普通聚合函数,前者对每个记录独立执行,而非聚合所有记录。窗口函数的分类丰富,如序号函数(row_number()...

Hive SQL高频面试知识点
窗口函数基本用法:根据示例数据,窗口函数通过基本语法和窗口设置方法应用。语法包括指定期望的分析函数,使用over()指定函数执行窗口范围。窗口范围可通过window_name、partition by、order by和rows参数设置。窗口函数用法举例:包括序号函数(row_number()、rank()、dense_rank)、分布函数(percent_rank()...

hivesql及窗口函数
解释:HiveSQL是Apache Hive中的SQL语言,用于处理存储在Hadoop分布式文件系统上的大规模数据集。HiveSQL提供了丰富的功能,包括数据查询、数据转换和数据分析等。窗口函数是HiveSQL中的一个重要特性,它们允许在数据集的特定窗口或子集上执行计算。窗口函数通常用于执行一些复杂的计算,如排名、累计总和、移动...

HiveSQL核心技能之窗口计算
位于 order by 之前 。在日常工作中,经常遇到 计算截止某月或某天的累计数值 ,在Excel可以通过函数来实现, 在HiveSQL里,可以利用窗口函数实现。1)2018年每月的支付总额和当年累计支付总额 2)对2017年和2018年公司的支付总额按月度累计进行分析,按年度进行汇总 说明:1、over中的 partition by ...

hive窗口函数总结
根据官网的介绍,hive推出的窗口函数功能是对hive sql的功能增强,确实目前用于离线数据分析逻辑日趋复杂,很多场景都需要用到。以下就是对hive窗口函数的一个总结附上案例。PRECEDING:往前 FOLLOWING:往后 CURRENT ROW:当前行 UNBOUNDED:起点(一般结合PRECEDING,FOLLOWING使用)UNBOUNDED PRECEDING 表示该窗口...

相似回答
大家正在搜