6

Я извлекаю данные JSON из столбца BigQuery, используя JSON_EXTRACT. Теперь я хочу извлечь списки значений и запустить агрегированные функции (например, AVG) против них. Тестирование выражения JsonPath .objects[*].v преуспевает на http://jsonpath.curiousconcept.com/. Но запрос:Как я могу применить агрегированные функции к данным, извлеченным из JSON в Google BigQuery?

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

бросает ошибку разобрать JsonPath на BigQuery. Возможно ли это на BigQuery? Или мне нужно предварительно обработать мои данные, чтобы запускать агрегированные функции в отношении данных внутри моего JSON?

Мои данные выглядит примерно так:

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

Это связано с другим question.

Обновление: Проблема может быть упрощена путем запуска двух запросов. Сначала запустите JSON_EXTRACT и сохраните результаты в представлении. Во-вторых, запустите функцию агрегата против этого представления. Но даже тогда мне нужно исправить выражение JsonPath $.objects[*].v, чтобы предотвратить JSONPath parse error.

+0

Все, что от jsonpath, который может возвращать список вещей (например: [*], [: 2], ...) Безразлично Кажется, он работает. –

+0

Задавая вопрос о '*': http://stackoverflow.com/questions/28719880/bigquery-jsonpath-values-of-json-array –

ответ

6

Плечо SPLIT() для поворота повторяемых полей в отдельные строки. Также может быть проще/очиститель поместить это в подзапрос и поставить 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; 

 Смежные вопросы

  • Нет связанных вопросов^_^