【问题标题】:How to get the difference in row from two table having same column in Hive如何从 Hive 中具有相同列的两个表中获取行中的差异
【发布时间】:2021-11-06 08:25:33
【问题描述】:

我所期待的类似于 Diff 检查器。我有两个表:表 1 和表 2。它们都有相同的列。表 1 有版本 1 数据,表 2 有版本 2 数据。与版本 1 相比,我需要找到我的版本 2 发生变化的地方。也许只显示随数据一起更改的列的输出会很有帮助。

尝试使用

SELECT * FROM Table-1 UNION ALL SELECT * FROM Table-2

数据量很大,运行需要数小时,而且我必须手动检查差异发布此内容。我相信应该有一种有效的方法来做到这一点。

表 1:

id name email
1 person1 person1@mail.com
2 person2 person2@mail.com

表 2:

id name email
1 person4 person4@mail.com
2 person2 person2@mail.com

预期输出:

表 2 中的名称字段已更改。所以我想要类似于以下输出的内容,这应该有助于理解列名称和电子邮件中 ​​id 1 的值已更改。

id name email
1 person1 person1@mail.com
1 person4 person4@mail.com

【问题讨论】:

  • 请提供样本数据和期望的结果。
  • Hive SQL 似乎不支持减号或除号。我认为您最好的选择是在所有列上使用完整的外部连接,然后查看每一侧的空值。您可能希望在加入之前处理空值
  • @GordonLinoff 添加了示例场景。

标签: sql database join hive hiveql


【解决方案1】:

要获得所需的输出,您可以在匹配id 但不同的nameemail 的条件下使用self join。然后是每个表中的union 列。

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;

DEMO

【讨论】:

  • 感谢@phil-coulson 这真的很有帮助。
猜你喜欢
  • 1970-01-01
  • 2015-09-12
  • 1970-01-01
  • 1970-01-01
  • 2020-11-13
  • 1970-01-01
  • 2015-07-16
  • 2018-09-02
  • 2021-01-10
相关资源
最近更新 更多