【问题标题】:Unnesting structs in BigQuery在 BigQuery 中取消嵌套结构
【发布时间】:2023-09-05 19:53:01
【问题描述】:

在 BigQuery 中展平包含两个数组的结构的正确方法是什么?我有一个如图所示的数据集(struct.destination 和 struct.visitors 数组是有序的 - 即访问者计数专门对应于同一行中的目的地):

我想重新组织数据,以便获得每个独特的出发地和目的地组合的总访客数。理想情况下,最终结果将如下所示:

我尝试连续两次使用 UNNEST - 一次在 struct.destination 上,然后在 struct.visitors 上,但这会产生错误的结果(每个目的地被映射到访问者计数数组中的每个值,而它应该只被映射到同一行中的值):

SELECT
  origin,
  unnested_destination,
  unnested_visitors
FROM
  dataset.table,
  UNNEST(struct.destination) AS unnested_destination,
  UNNEST(struct.visitors) AS unnested_visitors

【问题讨论】:

    标签: sql struct google-cloud-platform flatten google-bigquery


    【解决方案1】:

    你有一个重复的结构。所以,我想你想要:

    SELECT origin,
           s.destination,
           s.visitors
    FROM dataset.table t CROSS JOIN
         UNNEST(t.struct) s;
    

    编辑:

    我明白了,你有一个由两个数组组成的结构。你可以这样做:

    SELECT origin, d.destination, v.visitors
    FROM dataset.table t CROSS JOIN
         UNNEST(struct.destination) s WITH OFFSET nd LEFT JOIN
         UNNEST(struct.visitors) v WITH OFFSET nv
         ON nd = nv
    

    【讨论】:

    • 感谢 Gordon 的超快速响应。我尝试了您的建议,但 BigQuery 给了我一个错误:“UNNEST 中引用的值必须是数组。UNNEST 包含 STRUCT、访问者 ARRAY> 类型的表达式”
    【解决方案2】:

    由于没有要测试的基础数据,因此难以测试,因此我使用您的数据集创建了自己的查询。据我所知,destination|visitors 不是 ARRAY 格式,而是 STRUCT 格式,因此您不需要 UNNEST 它。也可以查看这个帖子please :)

    SELECT
      origin,
      COUNT(struct.destination),
      COUNT(struct.visitors)
    FROM dataset.table
    GROUP BY 1
    

    【讨论】: