Spark scala完全联接在联接列上输出null
我尝试将两个具有相同列名的数据帧组合起来,以创建一个更大的新数据帧,保留所有数据。如果存在相同的id,我使用coalesce替换一个数据帧中的值 连接和合并结果很好,但是当id存在时,连接列(“id”)会导致Spark scala完全联接在联接列上输出null,scala,apache-spark,apache-spark-sql,outer-join,Scala,Apache Spark,Apache Spark Sql,Outer Join,我尝试将两个具有相同列名的数据帧组合起来,以创建一个更大的新数据帧,保留所有数据。如果存在相同的id,我使用coalesce替换一个数据帧中的值 连接和合并结果很好,但是当id存在时,连接列(“id”)会导致null值。不确定原因: 例如: val tmp = Seq( (1,"A"), (2,"B"), (3,"A"), (4,"A") ).toDF("id","label") val tmp2 = Seq( (1,"B"), (2,"B"), (3,"B"),
null
值。不确定原因:
例如:
val tmp = Seq(
(1,"A"),
(2,"B"),
(3,"A"),
(4,"A")
).toDF("id","label")
val tmp2 = Seq(
(1,"B"),
(2,"B"),
(3,"B"),
(5, "A")
).toDF("id","label")
代码:
通缉:
output:
+----+----------------------+
| id|coalesce(label, label)|
+----+----------------------+
| 5| A|
| 1| B|
| 2| B|
| 3| B|
| 4| A|
+----+----------------------+
将连接更改为
“full”
我们的“outer”
具有相同的结果 您正在执行完全外部联接,因此它将合并两个表中的所有行
由于您使用的是tmp
中的id
作为结果id,因此当tmp2
中有一行tmp
中不存在时,它不能接受有效值,因此为空
要获得预期的输出,您可以在第一列中使用另一个coalesce
,与在第二列中的操作相同
val tmp3 = tmp.join(tmp2, tmp("id") === tmp2("id"), "fullouter")
.select(coalesce(tmp("id"), tmp2("id")), coalesce(tmp2("label"), tmp("label")))
+----------------+----------------------+
|coalesce(id, id)|coalesce(label, label)|
+----------------+----------------------+
| 1| B|
| 3| B|
| 5| A|
| 4| A|
| 2| B|
+----------------+----------------------+
val tmp3 = tmp.join(tmp2, tmp("id") === tmp2("id"), "fullouter")
.select(coalesce(tmp("id"), tmp2("id")), coalesce(tmp2("label"), tmp("label")))
+----------------+----------------------+
|coalesce(id, id)|coalesce(label, label)|
+----------------+----------------------+
| 1| B|
| 3| B|
| 5| A|
| 4| A|
| 2| B|
+----------------+----------------------+