Apache spark 合并数据帧并拾取最新记录

Apache spark 合并数据帧并拾取最新记录,apache-spark,join,merge,apache-spark-sql,databricks,Apache Spark,Join,Merge,Apache Spark Sql,Databricks,我有两个数据帧 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

我有两个数据帧

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   |
|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   |
df2:

|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   |
|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删除重复项,即当两条记录具有相同的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)

但它似乎在考虑所有的栏目。如果有人能给出一些提示,那就太好了。

< P>你可以考虑以下方法:

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)

合并两个数据帧,并使用窗口函数和分组选择最新的时间戳。@ShankarKoirala数据大小以几百GB为单位。合并所有记录是个好主意吗?@WaqarAhmed union operation不洗牌数据。所以,我们不必担心性能。我将查看窗口功能和联合。谢谢。@HimanshuiiTian做窗口功能还是按顺序做洗牌?谢谢。我们必须按除日期以外的所有列进行分区吗?是的。。我们必须按除日期之外的所有列进行分区。我能问一下这背后的直觉吗?上面的任何操作都会执行随机操作吗?不,没有随机操作