Spark有条件地合并Scala中的2个数据帧

时间:2017-07-26 14:14:39

标签: scala apache-spark spark-dataframe

我有2个Dataframe,我需要有条件地将单个列合并在一起。只要id列中有空值,我就需要引用另一个DF来从那里获取值。

HomePage

我的最终结果是:

df1.show()
+-----+---+----+-----+
|group|cat|  id|value|
+-----+---+----+-----+
|    X|  A|   1| 20.0|
|    X|  A|   2| 20.0|
|    X|  A|null| 55.0|
|    X|  B|   1| 20.0|
|    X|  B|null| 55.0|
|    Y|  A|   3| 20.0|
|    Y|  A|   4| 20.0|
|    Y|  A|null| 55.0|
|    Y|  B|   4| 20.0|
|    Y|  B|null| 55.0|
+-----+---+----+-----+
df2.show()
+---+-------+
|cat|     id|
+---+-------+
|  A|1 2 3 4|
|  B|    1 4|
+---+-------+

我在这里尝试了类似于另一个答案的内容(Conditional Join in Spark DataFrame

+-----+---+-------+-----+
|group|cat|     id|value|
+-----+---+-------+-----+
|    X|  A|      1| 20.0|
|    X|  A|      2| 20.0|
|    X|  A|1 2 3 4| 55.0|
|    X|  B|      1| 20.0|
|    X|  B|    1 4| 55.0|
|    Y|  A|      3| 20.0|
|    Y|  A|      4| 20.0|
|    Y|  A|1 2 3 4| 55.0|
|    Y|  B|      4| 20.0|
|    Y|  B|    1 4| 55.0|
+-----+---+-------+-----+

但总是以空数据帧结束。

有关正确连接条件的任何想法?

1 个答案:

答案 0 :(得分:0)

您可以加入这两个数据框,然后使用id函数从id更新df2 coalesce

(df1.join(df2.withColumnRenamed("id", "id2"), Seq("cat"), "left")
    .withColumn("id", coalesce($"id", $"id2")).drop("id2").show)

+---+-----+-------+-----+
|cat|group|     id|value|
+---+-----+-------+-----+
|  A|    X|      1| 20.0|
|  A|    X|      2| 20.0|
|  A|    X|1 2 3 4| 55.0|
|  B|    X|      1| 20.0|
|  B|    X|    1 4| 55.0|
|  A|    Y|      3| 20.0|
|  A|    Y|      4| 20.0|
|  A|    Y|1 2 3 4| 55.0|
|  B|    Y|      4| 20.0|
|  B|    Y|    1 4| 55.0|
+---+-----+-------+-----+