在 BigQuery 中取消嵌套结构

Posted

技术标签:

【中文标题】在 BigQuery 中取消嵌套结构【英文标题】:Unnesting structs in BigQuery 【发布时间】:2020-03-14 04:34:48 【问题描述】:

在 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

【问题讨论】:

【参考方案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

【讨论】:

以上是关于在 BigQuery 中取消嵌套结构的主要内容,如果未能解决你的问题,请参考以下文章

在 BigQuery 中展平嵌套和重复的结构(标准 SQL)

BigQuery - 如何取消嵌套多个数组,并从一列分配值?

在 BigQuery 中取消嵌套多个嵌套字段

是否可以在 BigQuery 中取消嵌套数组,以便将嵌套数据按键值拆分为列?

如何在 BigQuery 中取消嵌套多个数组?

如何在 BigQuery 标准 SQL 中取消嵌套多个数组