【发布时间】:2019-12-29 03:12:59
【问题描述】:
我有两个表,为简单起见命名 products1 和 products2,具有相同的架构:
(
id int,
name varchar(255),
UNIQUE (id, name)
)
从技术上讲,它来自一个更复杂的架构,但我这样简化了它。 我需要和他们一起找出不匹配的地方。
说 products1 包含(1, "name1") and (1, "name11"), and (3, "name3")
products2 包含(1, "name1") and (1, "name11"), and (3, "name33"), and (4, "name4")
需要加入它们以查找名称中的不匹配,例如在上述情况下,不匹配将是(id, old_name, new_name) = (3, "name3", "name33")。不匹配是在两个表中都存在但名称不匹配的那些。因此,id=4 的记录不被视为不匹配。
我做了一个join,但是由于一个id可以有多个名字,结果有点出乎意料:
select p1.id, p1.name as old_name, p2.name as new_name
from products1 p1 join products2 p2 on p1.id = p2.id and p1.name <> p2.name
当 products1 中的 (1, "name1") 与 products2 中的 (1, "name11") 匹配时,它输出为不匹配。所以我总共有三个不匹配:
(id, old_name, new_name) =
(1, "name1", "name11"), (1, "name11", "name1"), (3, "name3", "name33")
但是,products1 中的另一行已与 products2 中的该行匹配,因此不应将其视为不匹配。我想要实现的只是将(3, "name3", "name33") 输出为不匹配。 id = 1 的其他行不应不匹配。
如何通过查询实现这一点?
注意:找到运行多个查询,因为这将在 spark/scala 中作为多个步骤运行。
【问题讨论】:
标签: sql scala apache-spark join