首页 > 解决方案 > 如何通过同时运行左外连接和右外连接来合并数据框中的两列

问题描述

我有两个表,每个表有 2 列,一个 id 列和一个收入列。我已经使用完全外连接连接了两个表,执行以下操作:

val income = incomeA.join(incomeB, incomeA("idA") === incomeB("idB"), "full")

产生以下集合:

+--------------------+----------+--------------------+----------+ 
|  idA               |  A_INCOME|  idB               |  B_INCOME|
+--------------------+----------+--------------------+----------+
|0d4f671c-552b-449...|      2250|                null|      null|
|9e03f92e-af0e-416...|      1250|                null|      null|
|                null|      null|c75d0d17-f3c1-497...|      4300|
|02572d79-bc54-427...|      2880|                null|      null|
|                null|      null|ca493eca-0709-4db...|      2320|
|cb7831ac-2550-435...|      1650|                null|      null|
|da7ac4c4-403b-466...|      2250|                null|      null|
|9bddb7b5-0047-4e1...|      5170|                null|      null|
|                null|      null|b54fc648-5f00-411...|       800|
|7aeade0a-47d4-459...|      4250|                null|      null|
|4fde8deb-a7de-45a...|      1650|                null|      null|
+--------------------+----------+--------------------+----------+

但我希望最终结果包含 3 列,而不是上面的内容,一个 id 列同时包含 idA 和 idB 以及两个收入列,如下所示:

+--------------------+----------+----------+ 
|  id                |  A_INCOME|  B_INCOME|
+--------------------+----------+----------+
|0d4f671c-552b-449...|      2250|      null|
|9e03f92e-af0e-416...|      1250|      null|
|c75d0d17-f3c1-497...|      null|      4300|
|02572d79-bc54-427...|      2880|      null|
|ca493eca-0709-4db...|      null|      2320|
|cb7831ac-2550-435...|      1650|      null|
|da7ac4c4-403b-466...|      2250|      null|
|9bddb7b5-0047-4e1...|      5170|      null|
|b54fc648-5f00-411...|      null|       800|
|7aeade0a-47d4-459...|      4250|      null|
|4fde8deb-a7de-45a...|      1650|      null|
+--------------------+----------+----------+

该表本质上应该是在该数据帧上进行完全左连接和完全右连接的结果。有没有办法做到这一点?你会如何处理这个问题?提前谢谢了!

标签: sqlscalaapache-sparkaws-glue

解决方案


我想你只是想要coalesce()

select coalesce(a.id, b.id) as id, a.income as a_income, b.income a b_income
from a full join
     b
     on a.id = b.id;

大多数数据库都支持标准USING语法,因此您也可以使用:

select id, a.income as a_income, b.income a b_income
from a full join
     b
     using (id);

推荐阅读