在 BigQuery 中取消嵌套结构

see*_*ss1 6 sql struct flatten google-bigquery google-cloud-platform

在 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
Run Code Online (Sandbox Code Playgroud)

Gor*_*off 5

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

SELECT origin,
       s.destination,
       s.visitors
FROM dataset.table t CROSS JOIN
     UNNEST(t.struct) s;
Run Code Online (Sandbox Code Playgroud)

编辑:

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

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
Run Code Online (Sandbox Code Playgroud)

  • 感谢戈登的快速回复。我尝试了您的建议,但 BigQuery 给了我一个错误:“UNNEST 中引用的值必须是数组。UNNEST 包含类型为 STRUCT<destination ARRAY<STRING>、访问者 ARRAY<STRING>> 的表达式” (4认同)