Scala apachespark聚合:基于另一列值聚合列

Scala apachespark聚合:基于另一列值聚合列,scala,apache-spark,aggregate,Scala,Apache Spark,Aggregate,我不确定我问的是否正确,也许这就是我至今没有找到正确答案的原因。无论如何,如果它是重复的,我会删除这个问题 我有以下资料: id | last_updated | count __________________________ 1 | 20190101 | 3 1 | 20190201 | 2 1 | 20190301 | 1 我想按“id”列按此数据分组,从“last_updated”中获取最大值,关于“count”列,我想保留“last_updated”具

我不确定我问的是否正确,也许这就是我至今没有找到正确答案的原因。无论如何,如果它是重复的,我会删除这个问题

我有以下资料:

id | last_updated | count
__________________________
1  | 20190101     | 3
1  | 20190201     | 2
1  | 20190301     | 1 
我想按“id”列按此数据分组,从“last_updated”中获取最大值,关于“count”列,我想保留“last_updated”具有最大值的行中的值。所以在这种情况下,结果应该是这样的:

id | last_updated | count
__________________________
1  | 20190301     | 1 
df
  .groupBy("id")
  .agg(max("last_updated"), ... ("count"))
所以我想它会是这样的:

id | last_updated | count
__________________________
1  | 20190301     | 1 
df
  .groupBy("id")
  .agg(max("last_updated"), ... ("count"))
是否有任何函数可用于根据“上次更新”列获取“计数”

我正在使用spark 2.4.0


谢谢您的帮助

您有两个选择,第一个更好,以便于我理解

选项1 在ID上执行窗口函数,在该窗口函数上创建一个最大值的列。然后选择所需列等于最大值的位置,最后删除该列并根据需要重命名最大列

val w  = Window.partitionBy("id")

df.withColumn("max", max("last_updated").over(w))
  .where("max = last_updated")
  .drop("last_updated")
  .withColumnRenamed("max", "last_updated")
选项2

  df.groupBy("id")
      .agg(max("last_updated").as("last_updated")
      .join(df, Seq("id", "last_updated")).show


    +---+-----------------+----------+
    | id|     last_updated|    count |
    +---+-----------------+----------+
    |  1|         20190301|         1|
    +---+-----------------+----------+
分组后,可以执行与原始数据帧的联接

df.groupBy("id")
.agg(max("last_updated").as("last_updated"))
.join(df, Seq("id", "last_updated"))
快速示例

输入

df.show
+---+------------+-----+
| id|last_updated|count|
+---+------------+-----+
|  1|    20190101|    3|
|  1|    20190201|    2|
|  1|    20190301|    1|
+---+------------+-----+
输出 选项1

import org.apache.spark.sql.expressions.Window
import org.apache.spark.sql.functions

val w  = Window.partitionBy("id") 

df.withColumn("max", max("last_updated").over(w))
  .where("max = last_updated")
  .drop("last_updated")
  .withColumnRenamed("max", "last_updated")


+---+-----+------------+
| id|count|last_updated|
+---+-----+------------+
|  1|    1|    20190301|
+---+-----+------------+
选项2

  df.groupBy("id")
      .agg(max("last_updated").as("last_updated")
      .join(df, Seq("id", "last_updated")).show


    +---+-----------------+----------+
    | id|     last_updated|    count |
    +---+-----------------+----------+
    |  1|         20190301|         1|
    +---+-----------------+----------+

谢谢你的快速回答。完美的这两种解决方案对我都有效,但我对选项1有点困惑。我以前从来没有用过窗户,所以我必须看得更近一些,以了解幕后发生了什么。但是无论如何,谢谢,我会把你的答案记为正确的。选项1基本上是为指定窗口(id)的每个值检索所需列(las_updated)的最大值。蒂纳克斯