我有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()
但似乎正在考虑所有的专栏。如果有人可以提供一些暗示,那就太好了。
答案 0 :(得分:2)
您可以考虑以下方法:
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)