合并数据帧并选择最新记录

时间:2018-05-16 11:59:07

标签: apache-spark join merge apache-spark-sql databricks

我有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()  

但似乎正在考虑所有的专栏。如果有人可以提供一些暗示,那就太好了。

1 个答案:

答案 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)