使用 BigQuery 取消嵌套 customDimensions

Posted

技术标签:

【中文标题】使用 BigQuery 取消嵌套 customDimensions【英文标题】:Unnesting customDimensions w/ BigQuery 【发布时间】:2018-03-01 20:12:33 【问题描述】:

我编写了一个标准 SQL 查询,用于从 BigQuery 中提取一些 Google Analytics(分析)数据。我在下面粘贴了一个用于测试的简化版本:

SELECT COUNT(DISTINCT(session_id))
FROM (
  SELECT
    CONCAT(CAST(fullVisitorId AS STRING), '.', CAST(visitStartTime AS STRING)) AS session_id
  FROM `myproject.ga_sessions_20180227`, UNNEST(hits) AS hits
);

运行此查询会输出 6,696 的唯一会话计数,与 GA UI 相比,这是准确的。

但是,当我在查询中引入 customDimensions 时,我会丢失一些行。运行此查询仅输出 6,606 个唯一会话。

SELECT COUNT(DISTINCT(session_id))
FROM (
  SELECT
    CONCAT(CAST(fullVisitorId AS STRING), '.', CAST(visitStartTime AS STRING)) AS session_id,
    MAX(IF(customs.index = 14, customs.value, NULL)) AS custom_id
  FROM `myproject.ga_sessions_20180227`, UNNEST(customDimensions) AS customs
  GROUP BY fullVisitorId, visitStartTime
);

我没有使用 hits.customDimensions,因为有问题的自定义维度基于用户级别,而不是命中级别。如果我不对输出进行分组,则会出现错误。

如何在不丢失行的情况下取消嵌套非命中的自定义维度?

【问题讨论】:

【参考方案1】:

问题是CROSS JOIN(逗号):当使用NULL 交叉连接一个表时 - 或者在这种情况下是一个空的customDimensions - 结果总共是NULL 而不仅仅是左表。 您想使用LEFT JOIN 而不是CROSS JOIN,因为这会保留左表:

FROM `table` LEFT JOIN customDimensions AS cd

此外,您还可以使用简单的子选择而不是连接子表/数组:

SELECT
  (SELECT value FROM t.customDimensions WHERE index=1) AS cd1
  , COUNT(1) AS Qty
FROM `project.dataset.ga_sessions_20180202` AS t
GROUP BY 1

【讨论】:

谢谢,马丁。但是我如何在同一个查询中也 UNNEST(hits)? 如果您只需要来自命中的聚合值或特定值,您还可以编写一个类似于 customDimensions 的子选择。

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

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

无法使用 google bigquery(标准)取消嵌套某些字段

在 BigQuery 中取消嵌套结构

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

在 BigQuery 中使用双数组取消嵌套 STRUCT

BigQuery 取消嵌套数组 - 获取重复项