移動平均線

根據僱主的角色計算僱主的工資移動平均值:

val movAvg = sampleData.withColumn("movingAverage", avg(sampleData("Salary"))
             .over( Window.partitionBy("Role").rowsBetween(-1,1)) )
  • withColumn() 建立一個名為 movingAverage 的新列,在 Salary 列上執行 average
  • over() 用於定義視窗規範。
  • partitionBy() 對列 Role 上的資料進行分割槽
  • rowsBetween(start, end) 此函式定義要包含在視窗中的行。引數(startend)取數字輸入,0 代表當前行,-1 代表前一行,1 代表下一行,依此類推。該函式包括 startend 之間的所有行,因此在該示例中,視窗中包括三行(-1,0,1)。
    scala> movAvg.show
+------+---------+------+------------------+
|  Name|     Role|Salary|     movingAverage|
+------+---------+------+------------------+
|   bob|Developer|125000|          116500.0|
|  mark|Developer|108000|139333.33333333334|
| peter|Developer|185000|130333.33333333333|
| simon|Developer| 98000|142333.33333333334|
|  eric|Developer|144000|117333.33333333333|
| henry|Developer|110000|          127000.0|
|  carl|   Tester| 70000|           67500.0|
|   jon|   Tester| 65000| 72333.33333333333|
| roman|   Tester| 82000|           74000.0|
|carlos|   Tester| 75000|           78500.0|
+------+---------+------+------------------+

如果當前行分別是第一行和最後一行,Spark 會自動忽略上一行和下一行。

在上面的示例中,第一行的 movingAverage 僅為當前行和下一行的平均值,因為前一行不存在。類似地,分割槽的最後一行(即第 6 行)是當前行和前一行的平均值,因為下一行不存在。