请解释 PySpark 中窗口函数的定义,并说明在实际数据处理中如何运用窗口函数完成聚合、排名等计算任务?
考察说明
考查对 PySpark 窗口函数概念及操作模式的理解。
回答思路
- 【回答框架 1】窗口函数基于特定窗口范围对行进行聚合计算,核心由 partitionBy 划分分组、orderBy 定义排序及 rowsBetween/rangeBetween 设定帧范围三部分构成,返回行数与原表一致。
- 【回答框架 2】使用时通常配合聚合函数(如 sum、avg)、排名函数(如 row_number、rank、dense_rank)或分析函数(如 lag、lead),通过 select 或 withColumn 添加计算列。
- 【回答框架 3】典型步骤:先创建 Window 对象指定分区与排序,再在聚合或排名函数中传入该窗口,最后执行动作算子触发计算,结果追加为新列。
- 【回答框架 4】窗口计算在分区内独立进行,避免全局 shuffle 的某些场景,但 partitionBy 仍会触发数据重分布,需结合数据规模合理设置分区数。
- 【回答框架 5】注意帧范围对计算行集的限制,以及 orderBy 缺失时默认全部分区作为窗口,确保语义符合预期。
- 【关键点 1】窗口函数由 partitionBy、orderBy 和帧范围共同定义
- 【关键点 2】支持聚合、排名及偏移分析三类常见用途
- 【关键点 3】返回行数与输入一致,适合追加结果列
- 【关键点 4】分区和排序直接影响计算边界与性能
- 【易错点 1】混淆窗口函数与 groupBy 聚合,后者会压缩行数
- 【易错点 2】忽略帧范围导致计算范围与预期不符
- 【易错点 3】过度使用全局排序引发性能瓶颈