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

Rya*_*ull 1 sql comparison set-difference google-bigquery difference

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

它应该适用于任何一对表,理想情况下不涉及编写依赖于表的实际列的查询。我真正需要知道的是这些表是否相等,但如果它可以向我显示不同行之间的差异,那将是一个奖励。

所以像(在伪代码中)

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) 
Run Code Online (Sandbox Code Playgroud)

但我收到了这个错误。

Column 1 in EXCEPT ALL has type that does not support set operation comparisons: STRUCT at [3:5]
Run Code Online (Sandbox Code Playgroud)

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

编辑

之前应该提到过,但无论表格行的顺序如何,我都需要它来工作。

Mik*_*ant 5

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

#standardSQL
SELECT TO_JSON_STRING(a) FROM `project.dataset.tableA` a
EXCEPT DISTINCT
SELECT TO_JSON_STRING(b) FROM `project.dataset.tableB` b
Run Code Online (Sandbox Code Playgroud)

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

#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
)
Run Code Online (Sandbox Code Playgroud)