Spark 中的窗口函数

在 Spark 中,窗口函数(Window Functions) 是一种强大的工具,用于在分组数据上执行复杂的聚合操作,同时保留原始数据的行。窗口函数允许你在数据的某个“窗口”内进行计算,例如计算排名、累积和、移动平均等。

窗口函数的核心思想是定义一个“窗口”(通过 Window 类),然后在这个窗口上应用聚合函数(如 row_numberranksumavg 等)。


1. 窗口函数的基本概念

(1)窗口的定义

窗口函数通过 Window 类定义,主要包括以下两个部分:

  • 分区(Partitioning):将数据分为多个组(类似于 GROUP BY)。

  • 排序(Ordering):在每个分区内对数据进行排序。

  • 窗口范围(Frame):定义窗口的大小(如当前行及其前后若干行)。

(2)常见的窗口函数
  • 排名函数row_numberrankdense_rankpercent_rank

  • 聚合函数sumavgminmaxcount

  • 分析函数leadlagfirst_valuelast_value


2. 窗口函数的语法

(1)定义窗口
import org.apache.spark.sql.expressions.Window

val windowSpec = Window
  .partitionBy("column1", "column2") // 按列分区
  .orderBy("column3")                // 按列排序
  .rowsBetween(start, end)           // 定义窗口范围(可选)
  • partitionBy:指定分区的列。

### Spark SQL 窗口函数详解 #### 什么是窗口函数窗口函数是在一组相关行上执行计算并返回单个值的函数,但不像聚合函数那样会减少输入表中的行数。这意味着可以在不丢失原始记录的情况下应用复杂的统计运算[^2]。 #### 基本语法结构 窗口函数通常遵循如下模式: ```sql function() OVER ([partition_by_clause] order_by_clause [frame_clause]) ``` - `PARTITION BY`子句定义了分区逻辑,即如何分割数据集以便独立地应用于每一部分。 - `ORDER BY`指定排序顺序,在某些类型的窗口上下文中至关重要。 - 可选的框架子句进一步限定了参与计算的具体行范围[^3]。 #### 实战案例:查询各部门薪资最高的两名员工 考虑一个包含雇员信息的数据框,其中至少有三个字段——部门ID (`dept_id`)、姓名(`name`) 和工资(`salary`) 。为了找出每个部门内薪酬排名前两位的人选,可以采用如下的SQL语句实现这一目标[^4]: ```sql SELECT dept_id, name, salary, RANK() OVER (PARTITION BY dept_id ORDER BY salary DESC) as rank_num FROM employees; ``` 上述命令创建了一个新的列`rank_num`,它代表基于相同`dept_id`分组内的相对位置;接着可以通过简单的WHERE子句筛选出所需的结果: ```sql WITH ranked_employees AS ( SELECT dept_id, name, salary, RANK() OVER (PARTITION BY dept_id ORDER BY salary DESC) as rank_num FROM employees ) SELECT * FROM ranked_employees WHERE rank_num <= 2; ``` 这段代码先构建了一个带有排名信息的临时视图,再从中选取符合条件(即排名不超过第二位)的所有条目。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值