如何检查两个 table 在 Big Query 中是否包含相同的信息?

How to check if two table include the same information in Big Query?

假设我们有一个 table table_a 有两个字符串和一个 int 字段:

CREATE TABLE `YOUR_DATABASE.table_a` (
  `A1` STRING,
  `A2` INT64,
  `A3` STRING,
);

table_a 包含一些数据:

INSERT `YOUR_DATABASE.table_a` (A1, A2, A3)
VALUES("X111", 10, "2022-02-07 08:19:00"),
      ("Y222", 15, "2017-05-08 10:19:00"),
      ("X111", 0,"2011-08-02 02:30:00"),
      ("X111", 12, "2019-12-20 11:25:00"),
      ("Y222", 258, "2001-10-14 07:00:00"),
      ("Z333", 4, "2015-03-08 03:25:12")

我们还有另一个 table、table_b,与 table_a 有点相同。事实上,table_b 具有与 table_a 中完全相同的字段和值,并且它还有一个额外的 DATETIME 字段。这个额外的 DATETIME 字段 B4A3 基本相同,但已转换为标准 DATETIME 格式。

CREATE TABLE `YOUR_DATABASE.table_b` (
  `B1` STRING,
  `B2` INT64,
  `B3` STRING,
  `B4` DATETIME,
);

table_b中的值为:

INSERT `YOUR_DATABASE.table_b` (B1, B2, B3, B4)
VALUES("X111", 10, "2022-02-07 08:19:00", DATETIME(PARSE_TIMESTAMP("%Y-%m-%y %H:%M:%S","2022-02-07 08:19:00"),"America/Los_Angeles")),
      ("Y222", 15, "2017-05-08 10:19:00", DATETIME(PARSE_TIMESTAMP("%Y-%m-%y %H:%M:%S","2017-05-08 10:19:00"),"America/Los_Angeles")),
      ("X111", 0, "2011-08-02 02:30:00", DATETIME(PARSE_TIMESTAMP("%Y-%m-%y %H:%M:%S","2011-08-02 02:30:00"),"America/Los_Angeles")),
      ("X111", 12, "2019-12-20 11:25:00", DATETIME(PARSE_TIMESTAMP("%Y-%m-%y %H:%M:%S","2019-12-20 11:25:00"),"America/Los_Angeles")),
      ("Y222", 258, "2001-10-14 07:00:00", DATETIME(PARSE_TIMESTAMP("%Y-%m-%y %H:%M:%S","2001-10-14 07:00:00"),"America/Los_Angeles")),
      ("Z333", 4, "2015-03-08 03:25:12", DATETIME(PARSE_TIMESTAMP("%Y-%m-%y %H:%M:%S","2015-03-08 03:25:12"),"America/Los_Angeles"))

注意,table_atable_b 可能有也可能没有主键。如何检查 table_atable_b 是否包含相同的信息?我的数据库中有几个 table_a,我为每个创建了等效的 table_b;现在我想仔细检查并确保 table 包含相同的信息。

尝试以下操作:

SELECT
    *
FROM table_a
FULL OUTER JOIN table_b
 on FARM_FINGERPRINT(ARRAY_TO_STRING([A1, CAST(A2 AS STRING), A3],"")) = FARM_FINGERPRINT(ARRAY_TO_STRING([B1, CAST(B2 AS STRING), B3],""))
WHERE A1 IS NULL 
OR B1 IS NULL

此过程将每个 table 和 returns 的行串联并散列,其中每一侧都没有匹配项。

根据提供的样本数据,它产生:

如果只想知道表是否包含相同的数据,那么可以使用CHECKSUM()。这基本上计算列中所有值的累积散列并生成一个值。如果两个值相同,则您的表在这些列中具有相同的数据。

SELECT 
    CHECKSUM(A1), CHECKSUM(A2), CHECKSUM(A3)
FROM 
    YOUR_DATABASE.table_a

SELECT 
    CHECKSUM(A1), CHECKSUM(A2), CHECKSUM(A3)
FROM 
    YOUR_DATABASE.table_b

更多关于 CHECKSUM() here

请记住,如果您想检查哪些列不相等,最好使用 @Daniel Zagales 提到的 LEFT OUTER JOIN

编辑: Google BigQuery 不支持 CHECKSUM(),但您可以使用 FARM_FINGERPRINT() 而不是 CHECKSUM()。所以这就是您的代码的样子:

SELECT 
    FARM_FINGERPRINT(A1), FARM_FINGERPRINT(A2), FARM_FINGERPRINT(A3)
FROM 
    YOUR_DATABASE.table_a

SELECT 
    FARM_FINGERPRINT(A1), FARM_FINGERPRINT(A2), FARM_FINGERPRINT(A3)
FROM 
    YOUR_DATABASE.table_b

可以在 Google BigQuery 中找到有关哈希函数的更多信息 here