Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spark scala完全联接在联接列上输出null_Scala_Apache Spark_Apache Spark Sql_Outer Join - Fatal编程技术网

Spark scala完全联接在联接列上输出null

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"),

我尝试将两个具有相同列名的数据帧组合起来,以创建一个更大的新数据帧,保留所有数据。如果存在相同的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"),
  (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|
+----------------+----------------------+