假设我们有一个数据帧'A':
Id Name FavColor Address
1 John Black xyz
2 Mathew Orange www
3 Russel Red xxx
现在我有一个案例,其中不同的数据集来更新某些列中的值, 例如,让我们有DataFrame'B':
Id FavColor
1 Red
2 Black
和DataFrame'C':
Id Address
1 aaa
3 bbb
现在在这种情况下,更新'B'和'C'需要合并在'A'中, 我首先尝试合并'B'和'C',然后将它合并为'A',但是当我合并'B'和'C'时,我得到:
Id FavColor Address
1 Red aaa
2 Black null
3 null bbb
并且如果我将其与'A'合并将是错误的,因为Id = 2的地址将变为空并且Id = 3的FavColor将变为空。如何将即将更新的数据与“A”合并,并且即将到来的数据可能具有新属性,在这种情况下,它应该为“A”中没有该属性值的项目显示null。
答案 0 :(得分:0)
尝试使用左连接合并数据并仅获取更新的行。下面的代码合并了A和B,然后你可以用相同的方式将它们的结果与C合并。
scala> A.join(B, A("Id") === B("Id"), "left").
| withColumn("merged", when(B("FavColor").isNotNull, B("FavColor")).otherwise(A("FavColor"))).
| drop(B("FavColor")).drop(A("FavColor")).drop(B("Id")).
| withColumnRenamed("merged", "FavColor").show()
+---+------+-------+--------+
| Id| Name|Address|FavColor|
+---+------+-------+--------+
| 1| John| xyz| Red|
| 2|Mathew| www| Black|
| 3|Russel| xxx| Red|
+---+------+-------+--------+