【问题标题】:How do I merge two columns in a dataframe by running both a left and right outer join如何通过同时运行左外连接和右外连接来合并数据框中的两列
【发布时间】:2020-03-10 10:50:07
【问题描述】:

我有两张表,每张有 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|
+--------------------+----------+----------+

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

【问题讨论】:

  • 我删除了 MySQL 标签。它不支持full join,所以你不能使用那个数据库。

标签: sql scala apache-spark aws-glue


【解决方案1】:

我想你只是想要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);

【讨论】:

  • 太好了,非常感谢!那完成了工作!对于任何有兴趣的人,这就是我为适应上述火花所做的工作:incomeA.join(...).select( coalesce(incomeA("idA"), incomeB("idB")).as("accountId"), col("A_INCOME"), col("B_INCOME") )
猜你喜欢
  • 1970-01-01
  • 2014-02-24
  • 2015-01-11
  • 2023-03-07
  • 2023-04-04
  • 2015-11-16
  • 1970-01-01
  • 2014-09-23
  • 1970-01-01
相关资源
最近更新 更多