0
我無法找到通用方法來計算給定窗口上的總和(或任何聚合函數),以獲取DataFrame中可用列的列表。窗口上的總計(總和)列表列表
val inputDF = spark
.sparkContext
.parallelize(
Seq(
(1,2,1, 30, 100),
(1,2,2, 30, 100),
(1,2,3, 30, 100),
(11,21,1, 30, 100),
(11,21,2, 30, 100),
(11,21,3, 30, 100)
),
10)
.toDF("c1", "c2", "offset", "v1", "v2")
input.show
+---+---+------+---+---+
| c1| c2|offset| v1| v2|
+---+---+------+---+---+
| 1| 2| 1| 30|100|
| 1| 2| 2| 30|100|
| 1| 2| 3| 30|100|
| 11| 21| 1| 30|100|
| 11| 21| 2| 30|100|
| 11| 21| 3| 30|100|
+---+---+------+---+---+
鑑於如上所示的數據幀,可以很容易地找到總和列的列表,類似的代碼片段如下所示 -
val groupKey = List("c1", "c2").map(x => col(x.trim))
val orderByKey = List("offset").map(x => col(x.trim))
val aggKey = List("v1", "v2").map(c => sum(c).alias(c.trim))
import org.apache.spark.sql.expressions.Window
val w = Window.partitionBy(groupKey: _*).orderBy(orderByKey: _*)
val outputDF = inputDF
.groupBy(groupKey: _*)
.agg(aggKey.head, aggKey.tail: _*)
outputDF.show
但我似乎無法找到一個類似的方法用於窗口規範的集合函數。到目前爲止,我只能夠通過單獨指定每個列來解決這個如下 -
val outputDF2 = inputDF
.withColumn("cumulative_v1", sum(when($"offset".between(-1, 1), inputDF("v1")).otherwise(0)).over(w))
.withColumn("cumulative_v3", sum(when($"offset".between(-2, 2), inputDF("v1")).otherwise(0)).over(w))
如果有一種方法在列的動態列表來做到這一點匯聚我會很感激。謝謝!
您是否嘗試過使用'inputDF.types.foreach'? – philantrovert
謝謝。你能否詳細說明在這種情況下我可以如何使用它們。我的outputDF2應該包含輸入中的所有列以及列表中指定列的運行總和 – Yash