gpt4 book ai didi

scala - Apache Spark 聚合 : aggregate column based on another column value

转载 作者:行者123 更新时间:2023-12-04 10:54:54 25 4
gpt4 key购买 nike

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

我有以下数据:

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"))

是否有任何函数可用于根据“last_updated”列获取“计数”。

我正在使用 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"))

快速示例

输入

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

关于scala - Apache Spark 聚合 : aggregate column based on another column value,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59268122/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com