gpt4 book ai didi

apache-spark - 合并数据帧并选择最新记录

转载 作者:行者123 更新时间:2023-12-04 04:05:09 26 4
gpt4 key购买 nike

我有 2 个数据框。

df1:

|Timestamp                        |ProjectId|AusID|Version|
+---------------------------------+---------+-------------+
|2017-09-19 16:57:36.000642 +02:00|20034 |529 |2017 |
|2017-09-19 16:58:32.000642 +02:00|20035 |973 |2017 |
|2017-09-21 12:51:36.000642 +02:00|20034 |521 |2017 |
|2017-09-22 17:58:36.000642 +02:00|20035 |543 |2017 |

df2:

|Timestamp                        |ProjectId|AusID|Version|
+---------------------------------+---------+-------------+
|2017-09-20 08:46:17.465000 Z |20034 |513 |2017 |
|2017-09-20 08:46:17.465000 Z |20035 |973 |2017 |
|2017-09-21 08:46:17.465000 Z |20034 |521 |2017 |
|2017-09-22 08:46:17.465000 Z |20035 |587 |2017 |

这些记录以百万为单位,只有几列。我想合并两个数据框并使用 AusID 删除重复项,即当 2 条记录具有相同的 AusID 时,选择最新的一个(根据日期)并删除另一个。另一个问题是,两个数据框中的日期格式也不同。

我尝试使用以下方法:

df1.union(df2).except(df1.intersect(df2)).show()  

但看起来,它正在考虑所有列。如果有人可以提供一些提示,那就太好了。

最佳答案

您可以考虑以下方法:

result = df1.unionAll(df2)
import org.apache.spark.sql.expressions._

val windowSpec = Window.partitionBy("ProjectId","AusID","Version").orderBy(col("Timestamp").asc)
val latestForEachKey = result.withColumn("rank", rank().over(windowSpec)).filter($"rank" === 1).drop("rank")
latestForEachKey.show(false)

关于apache-spark - 合并数据帧并选择最新记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50370358/

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