繁体   English   中英

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

[英]How to merge two dataframes spark java/scala based on a column?

我有两个数据帧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

使用外部join然后coalesce 在Scala中:

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将给出第一个非空值的值,在这种情况下,它将返回:

+---+----+
| id|name|
+---+----+
| 20| pqr|
| 40| lmn|
| 10| abc|
| 30| xyz|
+---+----+
df1.join(df2, Seq("id"), "leftanti").union(df2).show

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM