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