Bigquery 表嵌套多值列在查询时出错

Posted

技术标签:

【中文标题】Bigquery 表嵌套多值列在查询时出错【英文标题】:Bigquery table nested multi-valued columns giving error when querying 【发布时间】:2020-05-20 23:59:07 【问题描述】:

我正在尝试将具有嵌套多值列的表中的数据加载到具有相同架构但少一个或多个字段的另一个表中。

表 1 架构:

    Person                  RECORD   REPEATED   ;
    Person.Address          RECORD   REPEATED   ;
    Person.Address.phone    INTEGER  NULLABLE   ;
    Person.Address.zip      INTEGER  NULLABLE   ;
    Person.flag             INTEGER             ;
    Wt                      INTEGER             ;

表 2 架构:

    Person                  RECORD   REPEATED   ;
    Person.Address          RECORD   REPEATED   ; 
    Person.Address.phone    INTEGER  NULLABLE   ;
    Person.flag             INTEGER             ;
    Wt                      INTEGER             ;

请注意,这两个表的唯一区别是表 2 没有“zip”字段。

我正在尝试使用以下查询从 Table-1 加载 Table-2:

    INSERT INTO TABLE-2
    SELECT
    ARRAY (SELECT AS STRUCT (ARRAY (SELECT AS STRUCT (SELECT PA.phone from unnest (P.Address) as 
    PA)), P.flag) from unnest(Table-1.Person) as P), s.Wt
    from Table-1

这总是会引发以下错误: “查询列 1 的类型为 ARRAY>,INT64>>>,无法插入到类型为 ARRAY> 的列 Person 中,在 [2:1] 处标记为 INT64>>”

如果您查看查询,它与目标列的查询完全匹配。知道出了什么问题吗?

【问题讨论】:

【参考方案1】:

以下是 BigQuery 标准 SQL

INSERT INTO `project.dataset.table2`
SELECT * REPLACE(
  ARRAY(
    SELECT AS STRUCT * REPLACE(
      ARRAY(SELECT AS STRUCT * EXCEPT(zip) FROM p.Address) 
      AS Address) 
    FROM t.Person p
  ) AS Person
  )
FROM `project.dataset.table1` t  

上面生成的模式与 table1 中的模式完全相同,但 zip 字段除外,只需从地址记录中“提取”该字段即可。无论您有多少其他字段,其他所有内容都保持不变

【讨论】:

非常感谢 Mikhail...它帮助了,尤其是“EXCEPT”命令.. 嗨,米哈伊尔..一个快速的疑问..BigQuery 没有名为“INTEGER”的数据类型,对吧?而是 INT64。但是,当我们将模式提取为 JSON 时,数据类型显示为“INTEGER”。 INTEGER 和 INT64 是一回事吗?

以上是关于Bigquery 表嵌套多值列在查询时出错的主要内容,如果未能解决你的问题,请参考以下文章

无法识别的名称:使用 bigquery 标准 sql 进行嵌套查询时出错

通过 vba ms 访问将多值列的数据绑定到组合框中

JSON 表架构到 bigquery.TableSchema 用于 BigQuerySink

BigQuery:从视图中查询时出错

从访问中读取多值列到c#

如何使用类型化数据集将多值列拆分为单独的行?