【问题标题】:Generic comparison method for two tables in BigQuery if tables contain STRUCT type如果表包含 STRUCT 类型,则 BigQuery 中两个表的通用比较方法
【发布时间】:2019-12-08 01:44:54
【问题描述】:

我正在寻找一种通用方法来比较 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) 

但是我收到了这个错误。

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

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

编辑

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

【问题讨论】:

  • 你不能比较数组和结构类型,首先你需要将它们转换为字符串,例如转换为json字符串to_json_string(<your_struct_column>)

标签: sql google-bigquery comparison difference set-difference


【解决方案1】:

我想你正在寻找类似下面的东西开始

#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
)

【讨论】:

  • 抱歉,我的问题应该更具体一些。但是无论表中行的顺序如何,我都需要它来工作。当表以相同的顺序包含相同的数据时,此解决方案似乎可以正常工作。
  • 我不确定我明白你的意思以及订单的位置!我提出的解决方案不依赖于对行的排序
  • 感谢 Mikhail,您的方法确实有效。我的数据有问题,这就是为什么我一开始认为它没有问题。
  • 感谢您的确认 - 我现在感觉好多了,很高兴它对您有用 :o)
猜你喜欢
  • 1970-01-01
  • 2018-12-21
  • 1970-01-01
  • 2012-01-06
  • 2015-04-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多