6

Ich extrahiere JSON-Daten aus einer BigQuery-Spalte mit JSON_EXTRACT. Jetzt möchte ich Listen von Werten extrahieren und Aggregatfunktionen (wie AVG) gegen sie ausführen. Das Testen des JsonPath-Ausdrucks .objects[*].v erfolgt erfolgreich unter http://jsonpath.curiousconcept.com/. Aber die Abfrage:Wie kann ich Aggregatfunktionen auf Daten anwenden, die aus JSON in Google BigQuery extrahiert wurden?

SELECT 
    JSON_EXTRACT(json_column, "$.id") as id, 
    AVG(JSON_EXTRACT(json_column, "$.objects[*].v")) as average_value 
FROM [tablename] 

wirft einen JsonPath Parse-Fehler auf BigQuery. Ist dies bei BigQuery möglich? Oder muss ich meine Daten vorverarbeiten, um Aggregatfunktionen gegen Daten in meinem JSON auszuführen?

sieht Meine Daten wie folgt aus:

# Record 1 
{ 
    "id": "abc", 
    "objects": [ 
    { 
     "id": 1, 
     "v": 1 
    }, 
    { 
     "id": 2, 
     "v": 3 
    } 
    ] 
} 
# Record 2 
{ 
    "id": "def", 
    "objects": [ 
    { 
     "id": 1, 
     "v": 2 
    }, 
    { 
     "id": 2, 
     "v": 5 
    } 
    ] 
} 

Diese auf einen anderen question verwandt ist.

Aktualisierung: Das Problem kann durch Ausführen von zwei Abfragen vereinfacht werden. Führen Sie zuerst JSON_EXTRACT aus und speichern Sie die Ergebnisse in einer Ansicht. Führen Sie zweitens die Aggregatfunktion für diese Ansicht aus. Aber selbst dann muss ich den JsonPath-Ausdruck $.objects[*].v korrigieren, um die JSONPath parse error zu verhindern.

+0

Alles, was von jsonpath, die eine Liste der Dinge zurückkehren können (zB: [*], [2], ...) doesn Es scheint nicht zu funktionieren. –

+0

Fragen speziell über das '*': http://StackOverflow.com/Questions/28719880/Bigquery-Jsonpath-Values-of-JSon-array –

Antwort

6

Nutzen Sie SPLIT(), um wiederholbare Felder in separate Zeilen zu pivotieren. Auch könnte einfacher/Reiniger sein, dies in eine Unterabfrage zu setzen und AVG setzt außen:

SELECT id, AVG(v) as average 
FROM (
SELECT 
    JSON_EXTRACT(json_column, "$.id") as id, 
    INTEGER( 
     REGEXP_EXTRACT(
     SPLIT(
      JSON_EXTRACT(json_column, "$.objects") 
      ,"},{" 
     ) 
     ,r'\"v\"\:([^,]+),')) as v FROM [mytable] 
) 
GROUP BY id;