窗口函数的定义引用一个大佬的定义: a window function calculates a return value for every input row of a table based on a group of rows。窗口函数与与其他函数的区别:
- 普通函数: 作用于每一条记录,计算出一个新列(记录数不变);
- 聚合函数: 作用于一组记录(全部数据按照某种方式分为多组),计算出一个聚合值(记录数变小);
- 窗口函数: 作用于每一条记录,逐条记录去指定多条记录来计算一个值(记录数不变)。
窗口函数语法结构
<窗口函数>(参数)
OVER
(
[PARTITION BY <列清单>]
[ORDER BY <排序用清单列>] [ASC/DESC]
(ROWS | RANGE) <范围条件>
)
- 函数名:
- OVER: 关键字,说明这是窗口函数,不是普通的聚合函数;
- 子句
- PARTITION BY: 分组字段
- ORDER BY: 排序字段
- ROWS/RANGE窗口子句: 用于控制窗口的尺寸边界,有两种(ROW,RANGE)
- ROW: 物理窗口,数据筛选基于排序后的index
- RANGE: 逻辑窗口,数据筛选基于值
主要有以下三种窗口函数
- ranking functions: 数据排序函数, 比如 :rank(…)、row_number(…)等
- analytic functions: 统计比较函数, 比如:lead(…)、lag(…)、 first_value(…)等
- aggregate functions: 聚合函数, 比如:sum(…)、 max(…)、min(…)、avg(…)等
数据加载
from pyspark.sql.types import *
schema = StructType().add('name', StringType(), True).add('create_time', TimestampType(), True).add('department', StringType(), True).add('salary', IntegerType(), True)
df = spark.createDataFrame([
("Tom", datetime.strptime("2020-01-01 00:01:00", "%Y-%m-%d %H:%M:%S"), "Sales", 4500),
("Georgi", datetime.strptime("2020-01-02 12:01:00", "%Y-%m-%d %H:%M:%S"), "Sales", 4200),
("Kyoichi", datetime.strptime("2020-02-02 12:10:00", "%Y-%m-%d %H:%M:%S"), "Sales", 3000),
("Berni", datetime.strptime("2020-01-10 11:01:00", "%Y-%m-%d %H:%M:%S"), "Sales", 4700),
("Berni", datetime.strptime("2020-01-07 11:01:00", "%Y-%m-%d %H:%M:%S"), "Sales", None),
("Guoxiang", datetime.strptime("2020-01-08 12:11:00", "%Y-%m-%d %H:%M:%S"), "Sales", 4200),
(