6

JSON_EXTRACT kullanarak JSON verilerini bir BigQuery sütunundan ayıkladım. Şimdi değer listelerini ayıklamak ve bunlara karşı toplu işlevler (AVG gibi) çalıştırmak istiyorum. JsonPath ifadesinin .objects[*].v test edilmesi, http://jsonpath.curiousconcept.com/ üzerinde başarılı olur. Ama sorgusu:Google BigQuery'de JSON'tan çıkarılan verilere toplu işlevleri nasıl uygularım?

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

BigQuery'ye üzerinde JsonPath ayrıştırma hatası atar. BigQuery'de bu mümkün mü? Veya JSON'umdaki veriye karşı toplama işlevlerini çalıştırmak için verilerimi önceden işlemem gerekiyor mu?

My veri şuna benzer:

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

Bu da başka question ilişkilidir.

Güncelleme: sorun iki sorgu çalıştırarak basitleştirilmiş olabilir. Öncelikle JSON_EXTRACT'u çalıştırın ve sonuçları bir görünüme kaydedin. İkinci olarak, bu görünüme karşı birleştirme işlevini çalıştırın. Ancak o zaman bile JSONPath parse error'u önlemek için JsonPath ifadesini $.objects[*].v düzeltmem gerekiyor.

+0

şey: Ayrıca bir alt sorgu içine koymak ve dışarıda AVG koymak/kolay temizleyici olabilir Çalışmıyor gibiyim. –

+0

Özellikle şu adresten bilgi isteyin: * http: http://stackoverflow.com/questions/28719880/bigquery-jsonpath-values-of-json-array –

cevap

6

Tekrarlanabilir alanları ayrı satırlara döndürmek için SPLIT() öğesinden yararlanın. gelmez şeyler (: [*], [2], ... örneğin) bir listesini döndürebilir jsonpath gelen

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;