在 Spark 中,窗口函数(Window Functions) 是一种强大的工具,用于在分组数据上执行复杂的聚合操作,同时保留原始数据的行。窗口函数允许你在数据的某个“窗口”内进行计算,例如计算排名、累积和、移动平均等。
窗口函数的核心思想是定义一个“窗口”(通过 Window
类),然后在这个窗口上应用聚合函数(如 row_number
、rank
、sum
、avg
等)。
1. 窗口函数的基本概念
(1)窗口的定义
窗口函数通过 Window
类定义,主要包括以下两个部分:
-
分区(Partitioning):将数据分为多个组(类似于
GROUP BY
)。 -
排序(Ordering):在每个分区内对数据进行排序。
-
窗口范围(Frame):定义窗口的大小(如当前行及其前后若干行)。
(2)常见的窗口函数
-
排名函数:
row_number
、rank
、dense_rank
、percent_rank
。 -
聚合函数:
sum
、avg
、min
、max
、count
。 -
分析函数:
lead
、lag
、first_value
、last_value
。
2. 窗口函数的语法
(1)定义窗口
import org.apache.spark.sql.expressions.Window
val windowSpec = Window
.partitionBy("column1", "column2") // 按列分区
.orderBy("column3") // 按列排序
.rowsBetween(start, end) // 定义窗口范围(可选)
-
partitionBy
:指定分区的列。