在 Bigquery 中有效地取消嵌套值? (选择/案例/其他?)

Posted

技术标签:

【中文标题】在 Bigquery 中有效地取消嵌套值? (选择/案例/其他?)【英文标题】:Efficiently Unnest values within Bigquery? (Select/Case/other?) 【发布时间】:2020-05-14 19:56:19 【问题描述】:

我目前正在 BigQuery 中处理 Google 分析数据。目前,我必须在命中级别解压缩很多自定义维度。到目前为止,我遇到了两种方法:

  SELECT 
  (CASE WHEN hitcd.index=1 AND hitcd.value is not null THEN hitcd.value ELSE NULL END) as case_example,
  (SELECT x.value FROM UNNEST(h.customDimensions) x WHERE x.index =1) as select_example
  FROM 
  `dataset.ga_sessions_20200401` as t,
  UNNEST(customDimensions) as sess_cd,
  UNNEST(t.hits) as h,
  UNNEST(h.customDimensions) as hitcd

这两个看起来……都不够优雅。理想情况下,我会尝试从数组中选择特定的索引/值并返回一个扁平的数据结构,以便更便于报告。

有没有更好更有效的方法来实现这一点?目标是生成一个查询,以平整过去 2 年的数百万条记录。

【问题讨论】:

您能否提供示例数据、期望的结果以及您想要完成的任务的说明? 没有。没有更好的办法!取决于具体案例/目标,第一种或第二种方式可以更好地服务 【参考方案1】:

首先:要非常小心!

当您执行以下操作时:

 `dataset.ga_sessions_20200401` as t,
  UNNEST(customDimensions) as sess_cd,
  UNNEST(t.hits) as h,
  UNNEST(h.customDimensions) as hitcd

您正在产生爆炸性数量的记录。假设在一行中 customDimensions 有 10 个元素,t.hits 有 20 个,h.customDimensions 有 5 个。那么您将从一个行中创建 1000 行!

这可能不是您想要的 - 数据被嵌套以防止这种情况发生。

在展平之前,您需要决定:您希望展平数据的外观如何?

【讨论】:

对 - 这是可悲的事实哈哈。在实际的最终目标中,我需要展平以达到水平数据并从那里聚合。如果您不熟悉 BigQuery 中的 GA 数据:所有点击次数(点击次数/页面浏览次数/等)都存储在 1 个会话记录中。这些需要取消嵌套。从那里每个命中都有某些嵌套变量,我需要成为它们自己的列。因此,更有效的查询可能会省略最后一个“UNNEST(h.customDimensions) as hitcd”部分。据我所知,其他 UNNEST 语句仍然需要。 是的,请在问题中添加您期望数据在操作结束时的样子...否则嵌套是完美的,或者对其他表进行规范化并加入

以上是关于在 Bigquery 中有效地取消嵌套值? (选择/案例/其他?)的主要内容,如果未能解决你的问题,请参考以下文章

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

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

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

取消嵌套命中和取消嵌套会话范围的自定义维度 BigQuery 代码过滤器

如何在 BigQuery 中取消嵌套重复记录,一个数组给出列名,另一个给出列值?

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