谷歌 BigQuery 中的自定义维度

Posted

技术标签:

【中文标题】谷歌 BigQuery 中的自定义维度【英文标题】:Custom dimensions in google BigQuery 【发布时间】:2017-04-23 23:34:48 【问题描述】:

我正在使用大查询,并尝试将自定义维度与非自定义维度一起导入。分析是从应用程序发送的,基本上我想要一个包含列的表:UserID(自定义维度)、platformID(自定义维度)、ScreenName(基本上是“页面名称”的应用程序版本)和日期。该指标是分组到所有这些维度上的“屏幕浏览次数”。如下所示:

GA 报告的照片:

因此,在 bigquery 中,我可以获取已签出的数字(与上面的 GA 报告相比),直到我添加自定义维度。一旦我添加了自定义维度,这些数字就不再有意义了。

我知道自定义维度嵌套在大查询中。所以我首先确保使用 FLATTEN。然后我尝试不放平并得到相同的结果。这些数字毫无意义(比 GA 界面大数百倍)。

我的查询如下(一个没有 FLATTEN,一个有 FLATTEN)。

ps 我很想用

count(hits)

而不是

   count(hits.appInfo.screenName)

但是当我在子查询中选择匹配项时,我一直收到错误消息。

我没有展平的查询如下。如果你能帮我弄清楚为什么一旦我添加了自定义维度,所有数据都会变得混乱

  SELECT
  date,
  hits.appInfo.version,
  hits.appInfo.screenName,
  UserIdd,
  platform,
 count(hits.appInfo.screenName)


FROM (
          SELECT
          date,
          hits.appInfo.version,
          hits.appInfo.screenName,
          max(case when hits.customdimensions.index = 5 then hits.customdimensions.value end) within record as UserIdd,

          max(case when hits.customdimensions.index = 20 then hits.customdimensions.value end) within record as platform



          FROM
            TABLE_DATE_RANGE([fiery-cabinet-97820:87025718.ga_sessions_], TIMESTAMP('2017-04-04'), TIMESTAMP('2017-04-04'))

              )

  where UserIdd is not null
  and platform = 'android'

GROUP BY
  1,
  2,
  3,
  4,
  5
ORDER BY
  6 DESC

这是我对 FLATTEN 的查询(同样的问题 - 数字没有意义)

SELECT
date,
hits.appInfo.version,
  customDimensions.index,
  customDimensions.value,
  hits.appInfo.screenName,
   UserIdd,
 count(hits.appInfo.screenName)

FROM (FLATTEN(( FLATTEN((
          SELECT
          date,
          hits.appInfo.version,
            customDimensions.value,
            customDimensions.index,
            hits.appInfo.screenName,
          max(case when hits.customdimensions.index = 5 then hits.customdimensions.value end) within record as UserIdd,
            hits.type

          FROM
            TABLE_DATE_RANGE([fiery-cabinet-97820:87025718.ga_sessions_], TIMESTAMP('2017-04-04'), TIMESTAMP('2017-04-04'))), customDimensions.value)),hits.type))

WHERE
  customDimensions.value = 'Android'
  and customDimensions.index = 20
  and UserIdd is not null


GROUP BY
  1,
  2,
  3,
  4,
  5,
  6
ORDER BY
  7 DESC

【问题讨论】:

为什么这个问题有mysql标签? 【参考方案1】:

我不确定hits.customDimensions.* 将始终具有用户范围的维度(我猜您的 userId 指标是用户范围的)。

具体来说,用户范围的维度应该从customDimensions而不是hits.customDimensions查询。

理论上,第一步是通过扁平化或范围聚合使customDimensionshits.* 兼容。我将解释扁平化方法。

GA 记录的形状为(customDimensions[], hits[], ...),不利于查询这两个字段。我们首先将这些扁平化为(customDimensionN, hits[], ...)

上一层,通过选择hits.* 下的字段,我们隐式地将表格展平为(customDimensionN, hitN) 记录。我们过滤这些以仅包含匹配 (customDimension5, appviewN) 的记录。

最后一步是计算所有内容。

SELECT date, v, sn, uid, COUNT(*) 
FROM (
    SELECT
      date,
      hits.appInfo.version v,
      hits.appInfo.screenName sn,
      customDimensions.value uid
    FROM 
      FLATTEN((
          SELECT customDimensions.*, hits.*, date
          FROM
            TABLE_DATE_RANGE(
              [fiery-cabinet-97820:87025718.ga_sessions_], 
              TIMESTAMP('2017-04-04'),
              TIMESTAMP('2017-04-04'))),
      customDimensions)
WHERE hits.type = "APPVIEW" and customDimensions.index = 5)
GROUP BY 1,2,3,4
ORDER BY 5 DESC

这是另一种等效的方法。这使用了我在 GA BQ 食谱中推荐的范围聚合技巧。然而,从查询解释来看,MAX(IF(...)) WITHIN RECORD 似乎相当昂贵,在第一阶段触发了额外的COMPUTEAGGREGATE 阶段。不过,更容易消化的奖励积分。

SELECT sn, uid, date, v, COUNT(*) 
FROM (
    SELECT
      MAX(IF(customDimensions.index = 5, customDimensions.value, null)) within record as uid,
      hits.appInfo.screenname as sn,
      date,
      hits.appInfo.version as v,
      hits.type
    FROM 
      TABLE_DATE_RANGE([fiery-cabinet-97820:87025718.ga_sessions_], TIMESTAMP('2017-04-04'), TIMESTAMP('2017-04-04')))
WHERE hits.type = "APPVIEW" and uid is not null
GROUP BY 1,2,3,4
ORDER BY 5 DESC

我还不熟悉 BQ 的标准 SQL 方言,但它似乎可以简化这种争论。如果您要进行很多这样的查询,您可能需要考虑一下。

【讨论】:

我很想看看这是如何在标准 SQL 方言中完成的。

以上是关于谷歌 BigQuery 中的自定义维度的主要内容,如果未能解决你的问题,请参考以下文章

将嵌套的自定义维度列数据转置为行 Bigquery

无法使用 BigQuery 标准 SQL 提取特定 ID 的自定义维度

BigQuery 与高吞吐量谷歌(学术)搜索的自定义搜索?

如何获取应用了多个维度的自定义 Firebase 事件的唯一用户数?

Bigquery 中的自定义定义

如何使用自定义维度作为唯一标识符连接 BigQuery 中的表