本文主要介绍如下知识点:
① pyspark.sql.Window。什么是窗口?如何创建窗口?怎么理解窗口的含义?
② currentRow、unboundedFollowing、unboundedPreceding的含义。
③ rangeBetween()、rowsBetween()、rangeBetween()、rowsBetween()的含义。
④ 排名函数、分析函数、聚合函数在窗口上的应用。
在上一篇文章介绍partition by的使用实例时,我们用了窗口函数Window。本文我们就来详细介绍Window窗口、以及一些窗口函数的作用及使用方法。
当我们需要在DataFrame列的特定窗口中进行聚合操作时,Window窗口函数会派上用场。Window窗口函数在实际业务场景中非常实用,用的好的话能避免很多浪费时间的计算。
一、什么是窗口(Window)及如何使用PySpark中的Window?
1.1 什么是窗口?
在单表数据操作中,一般有下面两种操作范式:
- 针对单条数据的映射操作,例如每条数据加一的时候。
- 将数据分组后的聚合操作,例如进行分组统计的时候。
在第一种范式中有这样一种情况,当你要生成某条目标数据的时候你需要用到前后N条数据参与计算。
例如:当你需要基于每天的用户访问数,来计算七天的移动平均访问数,就需要按照时间排序,每一条数据的计算都需要前面6条数据一起参与计算。那这时就需要用到窗口(Window)的概念了,当前行(currentRow)与当前行的前6行一起组成了一个窗口。
窗口有点类似于group by,只不过窗口不会对结果进行分组,输出中的行数与输入中的行数相同。
1.2 PySpark中如何定义我们需要的指定范围的窗口?
首先我们需要了解一下窗口的位置属性:
- Window.unboundedPreceding:窗口的第一行
- Window.unboundedFollowing:窗口的最后一行
- Window.currentRow:窗口的当前行
在进行窗口移动时,窗口的当前行(currentRow)的位置是0,如果position小于0,表示在当前行之前,如果position大于0,表示在当前行之后。
举个例子:
网友评论