如何编写给出两个表差异的程序?

How do I write program that gives a diff of two tables?

场景

我有两个数据管道;说生产管道和开发管道。我需要验证每个管道末端产生的 tables 是否相同。这些 table 可能在不同的数据库中,在不同的数据中心中,并且每个可能包含数百行到十亿行。

任务

我需要提供每个 table 缺失的所有行,以及所有不匹配的行。如果存在不匹配的行,我需要提供特定的行。例如:

table1:
Name | Age |
Alice| 25  |
Bob  | 49  |
Jim  | 45  |
Cal  | 52  |

table2:
Name | Age |
Bob  | 49  |
Cal  | 42  |
Alice| 35  |

应该输出类似于:

table1 missing rows (empty):
Name | Age |
     |     |

table2 missing rows:
Name | Age |
Jim  | 45  |

mismatching rows:
Name | Age | table |
Alice| 25  | table1|
Alice| 35  | table2|
Cal  | 52  | table1|
Cal  | 42  | table2|

Bob 被忽略,因为该行匹配。

如果您想尝试一下,请随时跳到下面的 Question 部分。

我试过的

我试过使用 Spark。长话短说,Spark 并非用于连接和查询两个不同的数据库。更具体地说,我无法创建多个 SparkSession,并且我不想以不打算使用的方式使用 Spark。

本来想用Spark是因为想用“except”功能。这样我就可以从 table1 中减去 table2,反之亦然。这两个结果将包含我所有丢失的行和不匹配的行,我将能够对它们进行排序和标记。但是,我在使用 Spark 连接到两个不同的数据库时遇到了极大的困难。例如,在一个程序中连接一个Hive数据库和一个Postgres数据库,用Spark就很麻烦。

当前想法

  1. 我可以继续使用 Spark 的“except”逻辑的想法,但是我需要省略 Spark 并将每个 table 导入同一个数据库。我可以使用 SQL 中内置的“except”关键字。一旦我有了一组 table 描述 table1 和 table2 之间以及 table2 和 table1 之间的差异。我可以对它们中的每一个进行排序并逐行比较以找出哪些行应该被视为“缺失”,哪些应该被视为“不匹配”。'

  2. 我可以查询每个 table 中的所有行,对它们进行排序,然后逐行比较。我不确定与上述想法相比如何扩展,但排序操作对于一些较大的 tables 来说是相当昂贵的。

注意:我计划通过容器化程序并根据作业的大小为其提供不同的计算资源来实现可扩展性和弹性。

问题

我应该使用什么算法来获取输入并给出类似于 Task 部分中列出的示例的输出?

我不是在询问要使用哪些特定技术,但是,欢迎提出建议。也许将它们放在您答案的评论部分。我要求高级算法来实现 Task 中详述的输入和输出。

编辑:

您可以假设每个 table 都有一个主键。但是仍然需要检查列是否相等。

你能试试这样的东西吗?

/* table1 missing rows */
select t2.name, t2.age
from table1 t1
  right join table2 t2 
    on t1.name=t2.name
where t1.name is null

/* table2 missing rows */
select t1.name, t1.age
from table1 t1
  left join table2 t2 
    on t1.name=t2.name
where t2.name is null

/* mismatching rows */
select
  coalesce(t1.name, t2.name) as name,
  coalesce(t1.age, t2.age) as age,
  case when t1.name is not null then 'table1' else 'table2' end
from table1 t1
  full join table2 t2
      on t1.name=t2.name
     and t1.age=t2.age 
where t1.age is null
   or t2.age is null