如何将来自不同Dataframe的项目连接到一个公共DataFrame

时间:2016-10-28 05:29:53

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

假设我们有一个数据帧'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。

1 个答案:

答案 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|
+---+------+-------+--------+