如果表包含 STRUCT 类型,则 BigQuery 中两个表的通用比较方法

Generic comparison method for two tables in BigQuery if tables contain STRUCT type

我正在寻找一种通用方法来比较 BigQuery 中的两个 table,即使它们具有 STRUCT 类型的列。

它应该适用于任何一对 table,并且理想情况下不会涉及编写依赖于 table 的实际列的查询。我真正需要知道的是 table 是否相等,但如果它能告诉我不相同的行之间的差异,那将是一个奖励。

类似(伪代码)

sizeOf( TABLE A EXCEPT TABLE B ) == 0

Hash(TABLE A) == HASH(TABLE B)

会好的。

我试过用这个:

(   SELECT * FROM table1
    EXCEPT DISTINCT
    SELECT * FROM table2)  
UNION ALL
(   SELECT * FROM table2
    EXCEPT DISTINCT
    SELECT * FROM table1) 

但是我遇到了这个错误。

Column 1 in EXCEPT ALL has type that does not support set operation comparisons: STRUCT at [3:5]

有人知道解决这个问题的方法吗?

编辑

之前应该提到过,但无论 table.

的行顺序如何,我都需要它来工作

我想你正在寻找像下面这样的东西作为开始

#standardSQL
SELECT TO_JSON_STRING(a) FROM `project.dataset.tableA` a
EXCEPT DISTINCT
SELECT TO_JSON_STRING(b) FROM `project.dataset.tableB` b

或者,更完整的示例 - 以显示差异 - 注意:对于真正不同的表,这可能是非常累人的输出

#standardSQL
SELECT 'a' table, * FROM (
  SELECT TO_JSON_STRING(a) record FROM `project.dataset.tableA` a
  EXCEPT DISTINCT
  SELECT TO_JSON_STRING(b) FROM `project.dataset.tableB` b
)
UNION ALL
SELECT 'b', * FROM (
  SELECT TO_JSON_STRING(b) FROM `project.dataset.tableB` b
  EXCEPT DISTINCT
  SELECT TO_JSON_STRING(a) FROM `project.dataset.tableA` a
)