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|
+------+---------+------+