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