Apache spark 合并数据帧并拾取最新记录
我有两个数据帧 df1: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
|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做窗口功能还是按顺序做洗牌?谢谢。我们必须按除日期以外的所有列进行分区吗?是的。。我们必须按除日期之外的所有列进行分区。我能问一下这背后的直觉吗?上面的任何操作都会执行随机操作吗?不,没有随机操作