繁体   English   中英

在火花窗口函数中聚合多列

[英]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函数执行以下操作。 但是你将不得不做一些额外的任务,比如filterdrop

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM