如何在 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 自定义维度?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用调用 UDF 的 Python 脚本来使用 BigQuery API
如何在展平嵌套字段后将数据从一个 bigquery 表流式插入到另一个表?