【问题标题】:I can't query repeated fields in a Google BigQuery table我无法查询 Google BigQuery 表中的重复字段
【发布时间】:2020-06-04 17:05:59
【问题描述】:

我在 Google BigQuery 中有一个表,其中有重复记录,我按照 https://cloud.google.com/bigquery/docs/nested-repeated 的指南成功创建了表,并使用一些测试数据填充了表

INSERT INTO `<project>.<dataset>.<table>` (<list of fields, ending with repeated record name>)
VALUES
    (
        "string1", false, 200.0, "string2", 0.2, 2.345, false, "2020-01-02 12:34:56",
        [
            ("repeated field str1", CAST(2.01 AS FLOAT64), CAST(201 as NUMERIC), false),
            ("repeated field str2", CAST(4.01 AS FLOAT64), CAST(702 as NUMERIC), true)
        ]
    );

(等) 并且表格已成功填充,我也可以查询数据

select * from <dataset>.<table>

并返回所有重复和不重复的字段。 我也可以成功从表中查询到非重复字段,只要查询中没有指定重复字段即可。 但是,当我想在查询中包含特定的重复字段时(并且我正在遵循https://cloud.google.com/bigquery/docs/legacy-nested-repeated 的指南),例如

SELECT normalfield1, normalfield2, normalfield3, 
repeatedData.field1, repeatedData.field2, repeatedData.field3
FROM `profile_dataset.profile_betdatamultiples`;

我得到错误

Cannot access field <field name> on a value with type ARRAY<STRUCT<fieldname1 STRING, fieldname2 FLOAT64, fieldname3 NUMERIC, ...>> at [8:14]"

(令人讨厌的是,GCP 会截断错误消息,所以我看不到所有内容)

有什么建议可以在这里进行吗?

谢谢!

【问题讨论】:

    标签: google-bigquery


    【解决方案1】:

    以下是 BigQuery 标准 SQL

    #standardSQL
    SELECT normalfield1, normalfield2, normalfield3, 
      data.field1, data.field2, data.field3
    FROM `project.profile_dataset.profile_betdatamultiples`,
    UNNEST(repeatedData) data   
    

    如果应用于您问题中的示例数据

    输出是

    【讨论】:

    • 太好了,正是我需要的。谢谢!
    【解决方案2】:

    我用这段代码重新创建了表格:

    CREATE TABLE `temp.experiment` AS
    SELECT "string1" s1, false b, 200.0 i1, "string2" s2, 0.2 f1, 2.345 f2, false b2, TIMESTAMP("2020-01-02 12:34:56") t1,
      [
        STRUCT ("repeated field str1" AS s1, CAST(2.01 AS FLOAT64) AS f2, CAST(201 as NUMERIC) AS n1, false AS b), 
        STRUCT ("repeated field str2", CAST(4.01 AS FLOAT64), CAST(702 as NUMERIC), true)
      ] AS b1
    

    现在我可以像这样查询特定的嵌套行:

    SELECT s1, b, s2
     ,  b1[OFFSET(0)].s1 AS arr_s1, b1[OFFSET(0)].f2, b1[OFFSET(0)].n1
    FROM  `temp.experiment`
    

    您可能想要UNNEST 而不是[OFFSET(0)],但问题并没有说明您期望什么结果。

    【讨论】:

    • 谢谢 - 上面的 UNNEST 是这里的关键,但我会调查您对 OFFSET 的建议,看看结果比较如何。
    猜你喜欢
    • 1970-01-01
    • 2017-09-25
    • 1970-01-01
    • 2015-08-04
    • 1970-01-01
    • 2016-07-17
    • 2013-07-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多