【问题标题】:How to flatten a struct in bigquery standard sql?如何在 bigquery 标准 sql 中展平结构?
【发布时间】:2017-08-24 15:43:19
【问题描述】:

通过以下标准 sql 查询,我可以在 BigQuery 中返回一个结构表,其中包含来自 a 和 b 的所有字段。

SELECT a, b
FROM first_table a
JOIN second_table b
ON a.key = b.key;

生成的表架构将 a 作为 RECORD,b 作为 RECORD,其中 a.field1、a.field2、b.field1、b.field2 等都有其原始类型。

如果我将此表保存为 a_join_b,然后在 legacy_sql 中查询:

SELECT *
FROM a_join_b
;

它将展平结构并提供一个表,其中包含名为 a_field1、a_field2、...、b_field1、b_field2 的字段。注意表名和字段名之间的下划线,a 和 b 可以有相似的字段名。

BigQuery 标准 SQL 中有没有一种方法可以在不引用单个记录名称的情况下展平表?我查看了How to convert a nested flatten into Standard SQL 中的 UNNEST,但解决方案似乎需要加入必须命名的未嵌套字段。

【问题讨论】:

    标签: google-bigquery


    【解决方案1】:

    如果ab没有数组,那很简单:

    SELECT *
    FROM first_table a
    JOIN second_table b
    USING (key)
    

    SELECT a.*, b.* EXCEPT (key)
    FROM first_table a
    JOIN second_table b
    ON a.key = b.key
    

    如果它们确实包含数组,那么它取决于它们的布局(UNNEST 仅指数组,所以我怀疑它们可能)。如果可以,你能澄清一下表格的布局吗?

    【讨论】:

    • 谢谢,但这些查询不会预先添加表名 a 和 b。此外,如果 a 和 b 具有相同名称的字段,它们也不起作用。错误:不支持结果中的重复列名。这些表不包含数组。考虑查询:#standardSQL WITH first_table AS ( SELECT 777 AS key, 1 AS x, 2 AS y, 3 AS z ), second_table AS ( SELECT 777 AS key, 4 AS x, 5 AS y, 6 AS z ) SELECT * FROM first_table AS a JOIN second_table AS b USING (key)
    • 你想从这个例子中得到什么结果?
    • Mikhail Berlyant 在回复“有没有办法在 BigQuery 标准 SQL 中添加连接的表名?”时提供了公认的解决方案。堆栈中的问题:stackoverflow.com/questions/45692560/… .
    猜你喜欢
    • 1970-01-01
    • 2019-01-31
    • 1970-01-01
    • 1970-01-01
    • 2021-11-05
    • 1970-01-01
    • 2019-07-18
    • 2016-11-23
    • 2018-09-10
    相关资源
    最近更新 更多