在 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由于没有要测试的基础数据,因此难以测试,因此我使用您的数据集创建了自己的查询。据我所知,destination|visitors
不是 ARRAY 格式,而是 STRUCT 格式,因此您不需要 UNNEST 它。也可以查看这个帖子please :)
SELECT
origin,
COUNT(struct.destination),
COUNT(struct.visitors)
FROM dataset.table
GROUP BY 1
【讨论】:
以上是关于在 BigQuery 中取消嵌套结构的主要内容,如果未能解决你的问题,请参考以下文章
在 BigQuery 中展平嵌套和重复的结构(标准 SQL)
BigQuery - 如何取消嵌套多个数组,并从一列分配值?