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 进行嵌套查询时出错