Spark中over partition窗口函数(开窗函数)

一、窗口函数

	定义:能为每行数据划分一个窗口,然后对窗口范围内的数据进行计算,最后将计算结果给该行数据。

语法:select * ,函数(amount) over(窗口范围) total_amount from order_info;

1、 窗口范围分为:基于值和基于行两种(用between and指定范围)。

1-1、基于行:unbounded preceding从第一行开始(负无穷),[num] preceding从前num行开始,current row从当前行开始,[num] followwing后的num行开始;[num] preceding 前num行结束,current tow当前行结束,[num] following后num行结束,unbounded following至末尾结束(正无穷);

在这里插入图片描述

1-2、基于值:order by 排序时只能用整数型,between [num1] preceding and [num2] preceding 基于范围时:取(当前值-num1到当前值+num2)

2、缺省

over()中的三个部分内容partition by 、 order by 、(row|range)between…and…均可省略不写。

2-1、partition by 省略不写

1. 表示不分区

2-2、order by 省略不写

1.表示不排序
2.通常rows方法都会用order by排序
3.当rows的范围是从第一行到最后一行,通常才会省略
4.当range方法没有用order by时,无法确定划分区域,后面的between...and无效,相当于从第一行到最后一行

2-3、(rows|range)between…and…省略不写

则使用其默认值,默认值下:
1、若over()包含order by ,则默认值为:
range between unbounded preceding and current row
2、 若over()中不包含order by,则默认值为
row between unbounded preceding and unbounded follwing

二、常用窗口函数

按照功能,常用窗口可划分为以下几类:聚合函数、跨行取值函数、排名函数。		

1、聚合函数

1-1、max:最大值

求指定范围窗口中的最大值

1-2、 min:最小值

求指定范围窗口中的最小值

1-3、 sum:求和

求指定范围窗口中的某字段相加之和

1-4、 avg:平均值

求指定范围窗口中的字段平均值

1-5、couont:计数

求指定范围窗口中的字段记录进行计数

2、跨行取值函数

2-1、lag和lead

注:lag和lead不支持指定自定义窗口
功能:获取当前行的上/下边某行、某字段的值
语法:lag/lead(字段名,num,默认值) over(范围)
例:lag(order_date,1,‘2003-08-21’) over(partition by usser_id order_date) last_date
根据用户id分区,订单日期升序排序,取前一条的订单日期,默认值为‘2003-08-21’重新命名为last_date
在这里插入图片描述

2-2、first_value和last_value

可以窗口自定义
功能:获取第一个值/最后一 个值
语法:first_value(字段名,布尔值) over(范围)
布尔值的值为true:不跳过Null值,直接返回
布尔类型的值为false:当第一条记录这个字段为Null时,往下一条记录继续找,找到为止

例:first_value(order_date,false) over(partition by user_id order by order_date) first_date
`根据用户id分区,订单日期升序排序,取第一行数据的订单日期字段,找不到则返回null`

在这里插入图片描述

5、排名函数

常用排名函数:rank()、dense_rank()、row_number()

功能:计算排名
语法:rank() over(窗口范围)
例:rank() over(partition by course order by score desc ) rk
根据课程分组,成绩升序排序,然后成绩排名
在这里插入图片描述

5-1、rank()

当遇到相同结果时,返回并列排序结果,第三位是3

5-2、dense_rank()

当遇到相同结果时,返回并列排序结果,第三位是2

5-3、row _number()

当遇到相同结果时,随机排出1,2,3

6、列表函数

常用与列表有关的窗口函数函数:collect_list()、concat_ws()

6-1、collect_list()

功能:将某个范围内容写进列表
语法1:collect_list(存入字段名) over(窗口范围)
例:collect_list(provinceids) over(partition by regionid) provinceids
根据地区id分组后,取出范围内的每个省份名称放到provinceids中
在这里插入图片描述

6-2、concat_ws()

功能:将列表中的数据用指定字符分隔提取出来
语法:concat_ws(分隔字符串,提取列表名)
例:concat_ws(“,”,provinceids) provinceids
将provinceids列表中的数据通过,分隔读取出来,放到provinceids字段中
在这里插入图片描述

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: Spark SQL窗口函数over partition by是一种用于对数据进行分组计算的函数。它可以将数据按照指定的列进行分组,并在每个分组内进行计算。这种函数在数据分析和处理非常常见,可以帮助我们更方便地进行数据聚合和统计。 ### 回答2: Spark SQL窗口函数是一种强大的函数,可以对窗口内的数据进行分组聚合、排序、排名、分析计算等操作。在实际的数据处理过程,常常会遇到需要对数据进行分组、聚合等操作的场景,这时候,窗口函数就可以发挥重要作用。 Over partition by是spark sql窗口函数的一种非常强大的函数,能够对指定字段进行分组聚合。在使用over partition by时,需要定义一个窗口,即用来指定数据的分组方式。通常情况下,partition by子句用来指定需要分组的字段,over子句则用来执行数据计算的操作。 例如,如果需要计算一组数据不同时间点的总和,则可以使用over partition by函数来实现。首先,在select子句指定需要计算的字段,然后使用over partition子句指定分组方式,最后使用sum函数计算总和。如下所示: ``` SELECT time,value,sum(value) over (partition by time) FROM table_name; ``` 上述示例partition by子句使用time字段进行分组,然后将value字段用于计算每个分组的总和。 除了上述示例的聚合操作,Spark SQL的over partition by函数还可以执行窗口排序、排名、累计计算、百分比计算等多种计算操作。例如,使用over partition by函数来实现窗口排序,则可以使用排列相关的函数,如rank、dense_rank、row_number等。 总结来说,Spark SQL的over partition by函数是一种非常强大的窗口函数,可以在数据处理过程实现复杂的分组、排序、排名、累计计算、百分比计算等多种计算操作。对于需要对数据进行多重分组、聚合分析的场景,使用over partition by函数可以非常方便地实现数据分析处理的任务。 ### 回答3: Spark SQL窗口函数over partition by是一种用于在查询结果集处理数据的功能。窗口函数可以在数据划分子集,执行聚合函数,计算行号等操作。这些操作与简单的分组聚合或排序不同,因为他们不会对查询结果进行分组,而是对子集进行操作,同时保留查询结果集的完整性。 over partition by语法可用于将查询结果集划分为多个分区,然后在每个分区上执行操作。对于每个分区,分配一个排名或数字,允许在对查询结果集进行其他处理之前,对子集进行排序或聚合操作。 over partition by语法的基本语法格式为: SELECT col1, col2, sum(col3) OVER (PARTITION BY col1) FROM table1 以上语句将查询结果集按照col1进行分区,并对每个分区进行col3的聚合操作,最后在每行返回结果集的col1、col2、col3聚合总和。 over partition by语法还可以使用其他聚合函数,如avg()、min()、max()等等。同时,还支持rank()、dense_rank()、row_number()、ntile()等其他更高级的分析函数。 over partition by的使用可以帮助我们更好的处理查询结果集的数据。通过使用这个功能,我们可以轻松地执行各种分析操作,比如打造数据仪表盘、制定分析计划等等。当我们需要比单个分组细化分析数据时,over partition by语法就是非常有用的。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值