Spark SQL 3.0 数据分析:窗口函数与聚合
通过灵活组合窗口与聚合函数,可实现复杂分析逻辑(如漏斗分析、留存计算)而无需多轮JOIN操作,显著提升处理效率。帧的支持(如时间间隔窗口),并优化了窗口函数的执行计划生成效率。:计算每个部门的薪资排名与累计薪资。:Spark 3.0 增强了对。
·
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操作,显著提升处理效率。
更多推荐
所有评论(0)