【问题标题】:Spark conditionally merging 2 dataframes in ScalaSpark有条件地在Scala中合并2个数据帧
【发布时间】:2017-07-26 22:41:20
【问题描述】:

我有 2 个数据框,我需要有条件地将单个列合并在一起。每当 id 列中有空值时,我需要引用另一个 DF 以从那里获取值。

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

我最终想要的结果是:

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

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

val joinCondition = when($"a.id".isNull && $"a.cat" === "b.cat", $"a.id"===$"b.id")
    .otherwise($"a.id")

df1.as('a).join(df2.as('b), joinCondition).show

但总是以空数据框结束。

对正确的连接条件有什么想法吗?

【问题讨论】:

    标签: scala apache-spark spark-dataframe


    【解决方案1】:

    您可以连接两个数据框,然后使用coalesce函数从df2更新idid

    (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|
    +---+-----+-------+-----+
    

    【讨论】:

    • 谢谢!我知道我想多了,只是无法到达那里!
    猜你喜欢
    • 1970-01-01
    • 2019-08-10
    • 1970-01-01
    • 2017-12-30
    • 1970-01-01
    • 1970-01-01
    • 2019-12-01
    • 1970-01-01
    • 2020-08-27
    相关资源
    最近更新 更多