如何合并两个数据帧基于列引发java / scala?

时间:2018-05-09 08:56:57

标签: java scala apache-spark dataframe apache-spark-sql

我有两个数据帧DF1和DF2, id 作为唯一列, DF2可能包含DF1的现有记录的新记录和更新值,当我们合并两个数据帧时,结果应包括新记录,并且保留更新值的旧记录应保持原样。

输入示例:

id   name
10   abc
20   tuv
30   xyz

id   name
10   abc
20   pqr
40   lmn

当我合并这两个数据帧时,我希望结果为:

id   name
10   abc
20   pqr
30   xyz
40   lmn

2 个答案:

答案 0 :(得分:1)

使用外部join后跟coalesce。在斯卡拉:

val df1 = Seq((10, "abc"), (20, "tuv"), (30, "xyz")).toDF("id", "name") 
val df2 = Seq((10, "abc"), (20, "pqr"), (40, "lmn")).toDF("id", "name")

df1.select($"id", $"name".as("old_name"))
  .join(df2, Seq("id"), "outer")
  .withColumn("name", coalesce($"name", $"old_name"))
  .drop("old_name")

coalesce将给出第一个非null值的值,在这种情况下返回:

+---+----+
| id|name|
+---+----+
| 20| pqr|
| 40| lmn|
| 10| abc|
| 30| xyz|
+---+----+

答案 1 :(得分:0)

df1.join(df2, Seq("id"), "leftanti").union(df2).show

| id|name|
+---+----+
| 30| xyz|
| 10| abc|
| 20| pqr|
| 40| lmn|
+---+----+