如何从 Hive 中具有相同列的两个 table 中获取行的差异
How to get the difference in row from two table having same column in Hive
我期待的与差异检查器类似。我有两个 table:Table-1 和 Table-2。它们都有相同的列。 Table-1 有版本 1 数据,Table-2 有版本 2 数据。与版本 1 相比,我需要找到我的版本 2 发生变化的地方。也许仅显示与数据一起发生变化的列的输出会非常有用。
尝试使用
SELECT * FROM Table-1 UNION ALL SELECT * FROM Table-2
数据量很大,运行需要几个小时,而且我必须手动检查差异post。我相信应该有一种有效的方法来做到这一点。
Table 1:
id
name
email
1
person1
person1@mail.com
2
person2
person2@mail.com
Table 2:
id
name
email
1
person4
person4@mail.com
2
person2
person2@mail.com
预期输出:
name 字段在 table 2 中更改。所以我想要类似下面的输出,这应该有助于理解列名称和电子邮件中 id 1 的值已更改。
id
name
email
1
person1
person1@mail.com
1
person4
person4@mail.com
为了得到你想要的输出,你可以在匹配id
但不同name
和email
的条件下使用self join
。然后 union
列来自每个 table.
select b.*
from t1 a
join t2 b on a.id=b.id and (a.email<>b.email or a.name<>b.name)
union
select a.*
from t1 a
join t2 b on a.id=b.id and (a.email<>b.email or a.name<>b.name);
如果我是你,我会并排比较
select a.id,
a.name as v1_name,
b.name as v2_name,
a.email as v1_email,
b.email as v2_email
from t1 a
left join t2 b on a.id=b.id
where a.name<>b.name or a.email<>b.email;
我期待的与差异检查器类似。我有两个 table:Table-1 和 Table-2。它们都有相同的列。 Table-1 有版本 1 数据,Table-2 有版本 2 数据。与版本 1 相比,我需要找到我的版本 2 发生变化的地方。也许仅显示与数据一起发生变化的列的输出会非常有用。
尝试使用
SELECT * FROM Table-1 UNION ALL SELECT * FROM Table-2
数据量很大,运行需要几个小时,而且我必须手动检查差异post。我相信应该有一种有效的方法来做到这一点。
Table 1:
id | name | |
---|---|---|
1 | person1 | person1@mail.com |
2 | person2 | person2@mail.com |
Table 2:
id | name | |
---|---|---|
1 | person4 | person4@mail.com |
2 | person2 | person2@mail.com |
预期输出:
name 字段在 table 2 中更改。所以我想要类似下面的输出,这应该有助于理解列名称和电子邮件中 id 1 的值已更改。
id | name | |
---|---|---|
1 | person1 | person1@mail.com |
1 | person4 | person4@mail.com |
为了得到你想要的输出,你可以在匹配id
但不同name
和email
的条件下使用self join
。然后 union
列来自每个 table.
select b.*
from t1 a
join t2 b on a.id=b.id and (a.email<>b.email or a.name<>b.name)
union
select a.*
from t1 a
join t2 b on a.id=b.id and (a.email<>b.email or a.name<>b.name);
如果我是你,我会并排比较
select a.id,
a.name as v1_name,
b.name as v2_name,
a.email as v1_email,
b.email as v2_email
from t1 a
left join t2 b on a.id=b.id
where a.name<>b.name or a.email<>b.email;