Spark SQL 3.0 窗口函数与聚合分析

1. 核心概念
  • 窗口函数:在数据集的特定子集(窗口)上执行计算,保留原始行记录。
    语法:<窗口函数> OVER (PARTITION BY ... ORDER BY ... <窗口范围>)
  • 聚合函数:对数据分组后返回单一统计值(如求和、计数),会折叠多行为单行结果。
    语法:<聚合函数>(列) GROUP BY ...
2. 关键差异
特性 窗口函数 聚合函数
输出行数 与输入相同 按分组折叠
保留原始数据
典型应用场景 排名、移动平均、累积计算 分组统计、摘要报表
3. 窗口函数实战示例

场景:计算每个部门的薪资排名与累计薪资

SELECT 
  employee_id,
  department,
  salary,
  -- 窗口函数应用
  RANK() OVER (PARTITION BY department ORDER BY salary DESC) AS dept_rank,
  SUM(salary) OVER (PARTITION BY department ORDER BY hire_date 
                    ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS cumulative_salary
FROM employees

参数解析

  • PARTITION BY department:按部门划分窗口
  • ORDER BY hire_date:窗口内按入职日期排序
  • ROWS BETWEEN ...:定义窗口范围(此处为从起始到当前行)
4. 常用窗口函数
函数类型 示例 说明
排名函数 ROW_NUMBER(), RANK() 生成序号/排名
分析函数 LEAD(salary, 1), LAG() 访问偏移行数据
聚合窗口 SUM() OVER(), AVG() OVER() 在窗口内执行聚合计算
5. 与普通聚合联合使用
-- 先聚合再窗口计算:各部门平均薪资 vs 全员平均薪资
SELECT 
  department,
  AVG(salary) AS dept_avg,
  AVG(AVG(salary)) OVER () AS global_avg  -- 嵌套聚合
FROM employees
GROUP BY department

6. 性能优化建议
  • 分区控制:避免全表单分区(如 PARTITION BY constant
  • 范围界定:优先用 ROWS 替代 RANGE(减少排序开销)
  • 索引利用:对 ORDER BY 字段建立分区索引
  • 谓词下推:在窗口计算前用 WHERE 过滤无效数据

:Spark 3.0 增强了对 RANGE 帧的支持(如时间间隔窗口),并优化了窗口函数的执行计划生成效率。

7. 典型应用场景
  • 趋势分析:计算7日移动平均销售额
    AVG(sales) OVER (ORDER BY date ROWS BETWEEN 6 PRECEDING AND CURRENT ROW)
    

  • 会话划分:基于30分钟不活动切分会话
    SUM(is_new_session) OVER (ORDER BY event_time) AS session_id
    

  • TopN 筛选:取各部门薪资前3名
    SELECT * FROM (
      SELECT *, ROW_NUMBER() OVER (PARTITION BY dept ORDER BY salary DESC) AS rn
      FROM employees
    ) WHERE rn <= 3
    

通过灵活组合窗口与聚合函数,可实现复杂分析逻辑(如漏斗分析、留存计算)而无需多轮JOIN操作,显著提升处理效率。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐