Spark SQL 窗口函数介绍

窗口函数用于对统称为窗口的一组行进行操作(通常是聚合)。窗口函数在 Spark 1.4 或更高版本中有效。窗口函数提供了比内置函数或 UDF 更多的操作,例如 substr 或 round(在 Spark 1.4 之前广泛使用)。窗口函数允许 Spark SQL 的用户计算结果,例如给定行的排名或输入行范围内的移动平均值。它们显着提高了 Spark 的 SQL 和 DataFrame API 的表现力。

窗口函数的核心是根据一组行(称为 Frame)计算表的每个输入行的返回值。每个输入行都可以有一个与之关联的唯一帧。窗口函数的这种特性使它们比其他函数更强大。窗口函数的类型是

  • 排名功能
  • 分析功能
  • 聚合函数

要使用窗口函数,用户需要标记一个函数被用作窗口函数

  • 在 SQL 中支持的函数之后添加 OVER 子句,例如 avg(revenue) OVER (...);
  • 在 DataFrame API 中的受支持函数上调用 over 方法,例如 rank().over(...)

本文档旨在通过示例演示其中的一些功能。假设读者对 Spark DataFrame 的基本操作有一些了解,例如:添加新列,重命名列等。

读取样本数据集:

val sampleData = Seq( ("bob","Developer",125000),("mark","Developer",108000),("carl","Tester",70000),("peter","Developer",185000),("jon","Tester",65000),("roman","Tester",82000),("simon","Developer",98000),("eric","Developer",144000),("carlos","Tester",75000),("henry","Developer",110000)).toDF("Name","Role","Salary")

所需的进口报表清单:

import org.apache.spark.sql.expressions.Window
import org.apache.spark.sql.functions._

第一个声明导入 Window Specification。窗口规范包含指示哪些行将包含在窗口中的条件/规范。

scala> sampleData.show
+------+---------+------+
|  Name|     Role|Salary|
+------+---------+------+
|   bob|Developer|125000|
|  mark|Developer|108000|
|  carl|   Tester| 70000|
| peter|Developer|185000|
|   jon|   Tester| 65000|
| roman|   Tester| 82000|
| simon|Developer| 98000|
|  eric|Developer|144000|
|carlos|   Tester| 75000|
| henry|Developer|110000|
+------+---------+------+