【问题标题】:How do I use BigQuery DML to insert a row with an array within a struct within an array?如何使用 BigQuery DML 在数组中的结构中插入包含数组的行?
【发布时间】:2022-01-22 11:06:55
【问题描述】:

我正在尝试创建一个 Stack Overflow 问题,为了提出这个问题,我需要生成一个最小示例。在创建最小示例时,我使用 BigQuery DDL 创建表。表创建步骤成功,推断我选择的架构很好。但是我写的在其中插入一行的INSERT INTO 语句会导致不允许嵌套数组的错误。

创建表的代码,成功:

CREATE TABLE `my_dataset.test_data_for_so`
(
  date DATE,
  hits ARRAY<STRUCT<search STRUCT<query STRING, other_column STRING>, metadata ARRAY<STRUCT<key STRING, value STRING>>>>
);

这是我创建表后 BigQuery GUI 中架构的样子:

但是当我尝试使用INSERT INTO 使用以下 BigQuery DML 代码将一行数据插入此表时:

INSERT INTO `my_dataset.test_data_for_so` (date, hits)
VALUES (CAST('2021-01-01' AS date), [STRUCT<query STRING, other_column STRING>('foo bar', 'foo bar'), [STRUCT<key STRING, value STRING>('foo bar', 'foo bar')]])

我收到一个错误:

无法构造元素类型为 ARRAY>,因为 [8:103]` 不支持嵌套数组。

BigQuery 的文档表明这应该是可能的。他们声明数组中的数组是不可能的,但如果你在两者之间使用结构,这是可能的。这就是我相信我正在做的事情:

BigQuery 不支持直接构建数组数组。反而, 您必须创建一个结构数组,每个结构都包含一个 ARRAY 类型的字段。

https://cloud.google.com/bigquery/docs/reference/standard-sql/arrays#building_arrays_of_arrays

【问题讨论】:

    标签: sql google-bigquery


    【解决方案1】:

    改用下面的 - 你错过了一级 STRUCT

    INSERT INTO `my_dataset.test_data_for_so` (date, hits)
    VALUES (
        CAST('2021-01-01' AS date), 
        [STRUCT(
            STRUCT<query STRING, other_column STRING>('foo bar', 'foo bar') , 
            [STRUCT<key STRING, value STRING>('foo bar', 'foo bar')]
        )] 
        );
    

    现在它被插入到表中

    【讨论】:

    • 谢谢,所有这些类型相互嵌套的语法很难理解。 :)
    • 同意。通常为了解决这种复杂性,我试图保持代码的轮廓,使其遵循预期的结构——这样就更有可能把它弄好,而不是全部放在一行中:o)
    猜你喜欢
    • 2022-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-14
    • 2019-11-02
    • 1970-01-01
    • 2011-01-04
    相关资源
    最近更新 更多