移動平均線
根據僱主的角色計算僱主的工資移動平均值:
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)
此函式定義要包含在視窗中的行。引數(start
和end
)取數字輸入,0
代表當前行,-1
代表前一行,1
代表下一行,依此類推。該函式包括start
和end
之間的所有行,因此在該示例中,視窗中包括三行(-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 行)是當前行和前一行的平均值,因為下一行不存在。