2017-05-03 4 views
1

'Treffer' ist ein sich wiederholender Datensatz. So ist 'hits.customDimensions' unter 'Treffer'.Wie Sie einen sich wiederholenden Datensatz innerhalb eines sich wiederholenden Datensatzes in Google Big Query suchen Standard SQL

Ich habe diese Google Big Abfrage in Standard-SQL:

SELECT  

     visitNumber, 
     h.time, h.hour, h.minute, 
     h.page.PagePath, 


     h.customDimensions.value as language, /* not working */ 


      from 
       `550335029.ga_sessions_*` , UNNEST(hits) as h 
      where    
       h.customDimensions.index = 3 /* not working */ 

ich für die richtige Syntax suchen hits.customDimensions.index und hits.customDimensions.value zuzugreifen. Wenn ich die zwei "nicht funktionierenden" Zeilen entferne, wird die Abfrage ausgeführt.

Fehler sieht wie folgt aus:

GenericGBQException: Reason: invalidQuery, Message: Cannot access field customDimensions on a value with type ARRAY<STRUCT<hitNumber INT64, time INT64, hour INT64, ...>> at [40:46] 

Antwort

1

unten Versuchen für BigQuery Standard-SQL

SELECT 
    visitNumber, 
    h.time, 
    h.hour, 
    h.minute, 
    h.page.PagePath, 
    d.value AS language 
FROM 
    `550335029.ga_sessions_*`, 
    UNNEST(hits) AS h, 
    UNNEST(h.customDimensions) AS d 
WHERE d.index = 3 
1

Ich fand auch, dass Sie große Leistungen beobachten steigert, wenn Standard-SQL verwenden und einige unnesting Operationen vermeiden (aber das hängt davon ab, woran Sie gerade arbeiten).

Als Beispiel ist dies ein weiterer Weg, dies zu lösen:

SELECT 
    visitNumber, 
    h.time, 
    h.hour, 
    h.minute, 
    h.page.PagePath, 
    (select value from unnest(h.customDimensions) where index = 3) AS LANGUAGE 
FROM 
    `550335029.ga_sessions_*`, 
    UNNEST(hits) AS h 
WHERE 1 = 1 
AND REGEXP_EXTRACT(_table_suffix, r'.*_(.*)') BETWEEN FORMAT_DATE("%Y%m%d", DATE_SUB(CURRENT_DATE(), INTERVAL 1 DAY)) 
AND FORMAT_DATE("%Y%m%d", DATE_SUB(CURRENT_DATE(), INTERVAL 0 DAY)) 
and exists(select 1 from unnest(h.customDimensions) dim where dim.index = 3) 

Sie nicht viel Unterschied finden für das, was Sie jetzt tun, aber es ist interessant daran verschiedene Techniken zu halten in BQ zu arbeiten, wie Sie können Ihre Abfragen schließlich Dutzende Male schneller machen.

+0

Ich bin interessiert zu wissen, was UNNEST hier vermieden wurde, auf den ersten Blick sieht es so aus, als ob Sie die gleichen UNNESTING wie oben tun, nur eine von ihnen in eine Unterabfrage verschieben. –

+0

Wenn Sie das UNNEST auf das gesamte Dataset anwenden, werden alle Schlüssel außerhalb des nicht vorhandenen Arrays dupliziert. Indem Sie das tun, was ich getan habe, vermeiden Sie das, d. H. Nur das Array 'h.customDimension' ist nicht verschachtelt und es findet keine Duplizierung von externen Schlüsseln statt. –

Verwandte Themen