在 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 代码过滤器