【问题标题】:aggregate multiple columns in spark window function在火花窗口函数中聚合多列
【发布时间】:2018-01-16 22:17:13
【问题描述】:

我正在尝试聚合多个列。这是我的场景。

我有这样的列 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,则会引发错误。

【问题讨论】:

  • 你描述的和你的预期输出不匹配
  • 好吧可能是我描述错误。但我的预期输出是正确的。
  • 对于最高的RSSI_weightage,时间戳为1496745906。你的预期结果在哪里?我不明白你在用你的时间戳做什么。
  • 这就是逻辑。如果我得到最高的 Rssi_weighatge,那么我还需要检查关联的最新时间戳
  • 这就是为什么我在第一行提到 1496745909 时间戳

标签: scala apache-spark apache-spark-sql


【解决方案1】:

给定数据框

+----------+---------------+----------+---------------+
|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             |
+----------+---------------+----------+---------------+

不过,您可以改进上面的代码。希望回答对你有帮助

【讨论】:

  • 是否可以像我需要 tagID 和 Listner ID 那样按两列分组
  • 如果您这样做,您将无法获得预期的结果
  • 好的,谢谢你的建议!
  • 我的荣幸 :) @Jessijoseph
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-02-27
  • 1970-01-01
  • 1970-01-01
  • 2021-01-08
  • 1970-01-01
  • 2022-01-05
  • 1970-01-01
相关资源
最近更新 更多