2017-06-01 23 views
2

a post by Robert Sahlinに基づいて、BigQueryのインデックスでGoogleアナリティクスのカスタムディメンションにアクセスするには、BigQuery UDFを使用します。提案されている解決策では、RobertはJavaScript UDFを使用しています.Sql UDFで同じことを実行できるかどうかは疑問です.SQL UDFはJSより優れているはずです。BigQueryでUDFを使用してGoogleアナリティクスのカスタムディメンションをフラット化する方法

提案JS UDF:SQL 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

#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は常に単一の値(またはヌル)を返します。 SQL UDFは複数の結果を返す可能性があります。「スカラーサブクエリが複数の要素を生成しました」というエラーが発生します。 – stefandoorn

+0

前のコメントと関連しています。実際にはGoogleアナリティクスBigQueryのデータに実際のデータが含まれていました。だから理論だけではありません。私はこれを回避するために 'GROUP BY x.value'を追加しました。これは私のデータセット上のわずかなオフセットです。 – stefandoorn

+0

私がクエリをテストできるサンプルを私に与えたら、クエリをテストして修正を追加することができます。 –

関連する問題