SparkSQL | 窗口函数

本文介绍了SparkSQL中的窗口函数,包括数据加载、排名函数、分析函数和聚合函数的使用。窗口函数允许根据一组行计算每个输入行的返回值,不同于普通函数和聚合函数。文章详细阐述了窗口函数的语法结构,如PARTITION BY、ORDER BY和ROWS/RANGE子句,并列举了ranking、analytic和aggregate等类型的窗口函数。此外,还讨论了窗口尺寸边界的控制以及在Hive和Spark SQL中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

窗口函数的定义引用一个大佬的定义: 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),   
    (
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值