6

Sto estraendo i dati JSON da una colonna BigQuery utilizzando JSON_EXTRACT. Ora voglio estrarre liste di valori ed eseguire funzioni aggregate (come AVG) contro di loro. Il test dell'espressione JsonPath .objects[*].v ha esito positivo su http://jsonpath.curiousconcept.com/. Ma la domanda:Come posso applicare funzioni di aggregazione ai dati estratti da JSON in Google BigQuery?

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

getta un errore di analisi JsonPath su BigQuery. È possibile su BigQuery? Oppure ho bisogno di preelaborare i miei dati per eseguire funzioni aggregate rispetto ai dati all'interno del mio JSON?

miei dati è simile a questo:

# 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 
    } 
    ] 
} 

Questo è legato ad un altro question.

Aggiornamento: Il problema può essere semplificato eseguendo due query. Innanzitutto, esegui JSON_EXTRACT e salva i risultati in una vista. In secondo luogo, esegui la funzione aggregata contro questa vista. Ma anche in questo caso ho bisogno di correggere l'espressione JsonPath $.objects[*].v per impedire il JSONPath parse error.

+0

Qualsiasi cosa, da jsonpath che può restituire un elenco di cose (per esempio: [*], [: 2], ...) doesn sembra funzionare. –

+0

Chiedendo specificamente il '' ': http://stackoverflow.com/questions/28719880/bigquery-jsonpath-values-of-json-array –

risposta

6

Utilizzare SPLIT() per ruotare campi ripetibili in righe separate. Inoltre potrebbe essere più facile/più pulito per mettere questo in una sottoquery e mettere fuori AVG:

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;