2017-06-01 62 views
2

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

提出的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 

回答

6

与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()。

+0

虽然有区别。 JS UDF总是返回一个值(或null)。 SQL UDF可能会返回多个结果,这会导致错误:“标量子查询生成多个元素”。 – stefandoorn

+0

与之前的评论相关:我实际上在Google Analytics(分析)BigQuery数据中使用了真实数据。所以这不仅仅是理论上的。我现在增加了一个“GROUP BY x.value”来解决这个问题,因为它只是对我的数据集略微偏移。 – stefandoorn

+0

如果你给我一个样本,我可以测试查询,我可以测试查询并添加修复。 –

相关问题