[英]aggregate multiple columns in spark window function
我正在尝试对多列进行聚合。 这是我的场景。
我有一个像 TagID、ListnerID、Timestamp 和 RSSI_weightage 这样的列。
我想为每个 TagID 选择最高的 rssi_weightage。 而且我还需要为上述关联选择最高的时间戳。
例子。
TagID,ListnerID,Timestamp,RSSI_Weightage
2,101,1496745906,90
3,102,1496745907,70
3,104,1496745906,80
2,101,1496745909,60
4,106,1496745908,60
My expected output
2,101,1496745909,90
3,104,1496745907,80
4,106,1496745908,60
说明
对于 TagID 2,最高的 rssi_weighatge 是 90。但最新的时间戳是 1496745909。那是我的第一行。我对所有 tagID 所做的事情也是如此。
以上是我的预期输出。 我是这样试的。
val window = Window.partitionBy("tagShortID", "ListenerShortID").orderBy("RSSI_Weightage","Timestamp")
val prox = averageDF.withColumn("rank", row_number().over(window)).where($"rank" === 1)
但是上面的语句不能正常工作。 我得到的结果不正确。此外,如果我按顺序应用 desc,则会引发错误。
给定数据框作为
+----------+---------------+----------+---------------+
|tagShortID|ListenerShortID|Timestamp |RSSI_Weight_avg|
+----------+---------------+----------+---------------+
|2 |101 |1496745906|90 |
|3 |102 |1496745907|70 |
|3 |104 |1496745906|80 |
|2 |101 |1496745909|60 |
|4 |106 |1496745908|60 |
+----------+---------------+----------+---------------+
您可以使用Window
函数执行以下操作。 但是你将不得不做一些额外的任务,比如filter
和drop
import org.apache.spark.sql.functions._
val window = Window.partitionBy($"tagShortID")
val prox = averageDF.withColumn("RSSI_Weight_avg", max($"RSSI_Weight_avg").over(window))
.withColumn("rank", rank().over(window.orderBy($"Timestamp".desc)))
.filter($"rank" === 1)
.drop("rank")
你会得到结果
+----------+---------------+----------+---------------+
|tagShortID|ListenerShortID|Timestamp |RSSI_Weight_avg|
+----------+---------------+----------+---------------+
|3 |102 |1496745907|80 |
|4 |106 |1496745908|60 |
|2 |101 |1496745909|90 |
+----------+---------------+----------+---------------+
你可以改进上面的代码。 我希望答案有帮助
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.