如何检查两个 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 字段 B4
与 A3
基本相同,但已转换为标准 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_a
和 table_b
可能有也可能没有主键。如何检查 table_a
和 table_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。
假设我们有一个 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 字段 B4
与 A3
基本相同,但已转换为标准 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_a
和 table_b
可能有也可能没有主键。如何检查 table_a
和 table_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。