如何在 BigQuery 中使用 UDF 展平 Google Analytics 自定义维度?

Posted

技术标签:

【中文标题】如何在 BigQuery 中使用 UDF 展平 Google Analytics 自定义维度?【英文标题】:How to flatten Google Analytics custom dimensions with a UDF in BigQuery? 【发布时间】:2017-06-01 07:33:34 【问题描述】:

基于a post by Robert Sahlin,我想使用 BigQuery UDF 通过索引访问 BigQuery 中的任何 Google Analytics 自定义维度。在建议的解决方案中,Robert 使用 javascript UDF,我想知道是否可以对 SQL UDF 执行相同的操作 - 因为 SQL UDF 应该比 JS 执行得更好。

提议的JS UDF:

CREATE TEMPORARY FUNCTION customDimensionByIndex(index INT64, arr ARRAY<STRUCT<index INT64, value STRING>>)
RETURNS STRING
LANGUAGE js AS """
  for (var j = 0; j < arr.length; j++)
    if(arr[j].index == index)
      return arr[j].value;
    
  
  """;

SELECT 
  fullvisitorId,
  visitId,
  hit.hitnumber,
  customDimensionByIndex(6, hit.customDimensions) as author,
  customDimensionByIndex(7, hit.customDimensions) as category 
FROM `123456.ga_sessions_YYYYMMDD`
JOIN
  UNNEST(hits) as hit

【问题讨论】:

【参考方案1】:

使用 SQL UDF:

#standardSQL
CREATE TEMP FUNCTION customDimensionByIndex(indx INT64, arr ARRAY<STRUCT<index INT64, value STRING>>) AS (
  (SELECT x.value FROM UNNEST(arr) x WHERE indx=x.index)
);

SELECT 
  fullvisitorId,
  visitId,
  hit.hitnumber,
  customDimensionByIndex(1, hit.customDimensions),
  customDimensionByIndex(2, hit.customDimensions),
  customDimensionByIndex(3, hit.customDimensions)
FROM `google.com:analytics-bigquery.LondonCycleHelmet.ga_sessions_20130910`, UNNEST(hits) hit
LIMIT 1000

我不确定为什么原始解决方案在示例数据集上查看“命中”而不是“命中”列 - 所以要获得单个命中,我也必须 UNNEST() 它们。

【讨论】:

虽然有区别。 JS UDF 总是返回单个值(或 null)。 SQL UDF 可以返回多个结果,这会导致错误:'Scalar subquery generated more than one element''。 与上一条评论相关:我实际上是在 Google Analytics BigQuery 数据和真实数据上遇到的。所以这不仅仅是理论上的。我添加了一个GROUP BY x.value 来暂时解决这个问题,因为它只是对我的数据集的轻微偏移。 如果你给我一个样本,我可以测试查询,我可以测试查询并添加修复。 为了克服这个问题,基本上可以在选择x.value之前添加一个聚合函数,比如select max(x.value),例如

以上是关于如何在 BigQuery 中使用 UDF 展平 Google Analytics 自定义维度?的主要内容,如果未能解决你的问题,请参考以下文章

在 BigQuery 中展平嵌套层次结构

将 BigQuery 嵌套字段内容展平为新列而不是行

如何使用调用 UDF 的 Python 脚本来使用 BigQuery API

如何在展平嵌套字段后将数据​​从一个 bigquery 表流式插入到另一个表?

使用 Google Datalab,如何在 Google BigQuery 中使用 UDF 从复杂查询创建表?

在 google bigquery 中,如何使用 google python 客户端使用 javascript UDF