Google BigQuery:UNNEST 结构数组和未嵌套项作为结构

Posted

技术标签:

【中文标题】Google BigQuery:UNNEST 结构数组和未嵌套项作为结构【英文标题】:Google BigQuery: UNNEST array of structs and unnested item as struct 【发布时间】:2020-10-19 17:22:26 【问题描述】:

我有一个关于UNNEST使用结构的数组列的问题。

我的源表架构如下所示

fields:
 - id:                                  STRING::NULLABLE
 - response_choices:                    RECORD::REPEATED
 - response_choices.response_option_id: STRING::NULLABLE
 - response_choices.position:           INT64::NULLABLE
 - response_choices.rendered_position:  INT64::NULLABLE
 - response_choices.responded_at:       DATETIME::NULLABLE

当我执行以下查询时

SELECT
  * EXCEPT(response_choices),
  STRUCT(
    ro.response_option_id AS response_option_id,
    ro.position AS position,
    ro.rendered_position AS rendered_position,
    ro.response_datetime AS responded_at
  ) AS response_choice
FROM my_responses_table,
  UNNEST(response_choices) AS ro

查询返回的数据既包括结构(如上定义),但也将结构平面的列添加到结果中。所以架构如下所示

fields:
  - id:                                  STRING::NULLABLE
  - response_option_id:                  STRING::NULLABLE
  - position:                            INT64::NULLABLE
  - rendered_position:                   INT64::NULLABLE
  - responded_at:                        DATETIME::NULLABLE
  - response_choice:                     RECORD::NULLABLE
  - response_choice.response_option_id:  STRING::NULLABLE
  - response_choice.position:            INT64::NULLABLE
  - response_choice.rendered_position:   INT64::NULLABLE
  - response_choice.responded_at:        DATETIME::NULLABLE

但是,我会以一种只添加一个包含结构的字段的方式对数组进行 UNNEST。原因是struct中的某些字段与表源中已经存在的字段冲突。

我想得到类似下面的东西

fields:
  - id:                                  STRING::NULLABLE
  - response_choice:                     RECORD::NULLABLE
  - response_choice.response_option_id:  STRING::NULLABLE
  - response_choice.position:            INT64::NULLABLE
  - response_choice.rendered_position:   INT64::NULLABLE
  - response_choice.responded_at:        DATETIME::NULLABLE

任何正确方向的建议或指示将不胜感激!谢谢

【问题讨论】:

我认为您在问题顶部提供的架构(用于源表)有问题 - 请仔细检查并在需要时更正 感谢提示,我更新了架构 现在说得通了——看看答案:o) 【参考方案1】:

以下是 BigQuery 标准 SQL

#standardSQL
select t.* except(response_choices), 
  response_choice
from `project.dataset.my_responses_table` t,
unnest(response_choices) response_choice

【讨论】:

以上是关于Google BigQuery:UNNEST 结构数组和未嵌套项作为结构的主要内容,如果未能解决你的问题,请参考以下文章

BigQuery - 为啥在 Google Analytics 中提取交易数据不需要 UNNEST 运算符?

查看 Google Analytics 时如何 UNNEST 和展平 BigQuery 中的所有记录

Unnest 和 totals.timeOnSite(BigQuery 和 Google Analytics 数据)

对 Google Bigquery 中的嵌套字段使用 OFFSET 而不是 UNNEST

如何在 Google BigQuery 中使用 UNNEST 函数获取 COUNT?

Google Bigquery SQL UNNEST 和 STRING_AGG