首页 > 解决方案 > Spark合并两个数据帧并通过覆盖第二个数据帧的值来创建一个数据帧

问题描述

如何在 Apache Spark 中合并两个数据帧并通过覆盖第二个数据帧的值来创建单个数据帧?

输入:

val r1 = Seq((1, "A1_1"), (2, "A2_1"), (3, "A3_1"), (4, "A4_1")).toDF("c1","c2")
val r2 = Seq((3, "A3_2"), (4, "A4_2"), (5, "A5_2"), (6, "A6_2")).toDF("c1","c2")

期望的输出

+---+----+
| c1|  c2|
+---+----+
|  1|A1_1|
|  2|A2_1|
|  3|A3_2|
|  4|A4_2|
|  5|A5_2|
|  6|A6_2|
+---+----+

标签: apache-spark

解决方案


外部join(需要数据帧的别名,因为两者都包含相同的列名)和coalesce内置函数(coalesce将首先返回其中的非空列)应该得到您想要的输出

import org.apache.spark.sql.functions._
r1.as("r1").join(r2.as("r2"), col("r1.c1") === col("r2.c1"), "outer")
  .select(coalesce(col("r1.c1"), col("r2.c1")).as("c1"), coalesce(col("r2.c2"), col("r1.c2")).as("c2"))
  .show(false)

这应该给你

+---+----+
|c1 |c2  |
+---+----+
|1  |A1_1|
|6  |A6_2|
|3  |A3_2|
|5  |A5_2|
|4  |A4_2|
|2  |A2_1|
+---+----+

我希望答案有帮助


推荐阅读