BigQuery - запрос JSON - PullRequest
       8

BigQuery - запрос JSON

0 голосов
/ 18 мая 2018

У меня JSON хранится в таком формате:

[{
    "name": "total_video_views",
    "values": [{
        "value": 3720
    }]
}, {
    "name": "total_video_views_unique",
    "values": [{
        "value": 3648
    }]
}]

В файле JSON есть больше строк с множеством разных метрик.

Как я могу запросить это для определенной метрики?

(например, дайте мне значение для: name = total_video_views_unique )

Я могу запросить это, когда узнаю, по какому индексу это значение:

SELECT JSON_EXTRACT(<MY_JSON_STRING>, '$[1].name'), JSON_EXTRACT(<MY_JSON_STRING>, '$[1].values[0].value')

Спасибо.

Ответы [ 2 ]

0 голосов
/ 20 июня 2018

Чтобы преодолеть «ограничение» BigQuery для JsonPath, вы можете использовать пользовательскую функцию , как показано в примере ниже:
Он использует jsonpath-0.8.0.js, который можно загрузить из https://code.google.com/archive/p/jsonpath/downloads и загружено в Google Cloud Storage - gs: //your_bucket/jsonpath-0.8.0.js

#standardSQL
CREATE TEMPORARY FUNCTION CUSTOM_JSON_EXTRACT(json STRING, json_path STRING)
RETURNS STRING
LANGUAGE js AS """
    try { var parsed = JSON.parse(json);
        return JSON.stringify(jsonPath(parsed, json_path));
    } catch (e) { return null }
"""
OPTIONS (
    library="gs://your_bucket/jsonpath-0.8.0.js"
);
WITH t AS (
SELECT '''
{ "store": {
        "book": [ 
            { "category": "reference",
                "author": "Nigel Rees",
                "title": "Sayings of the Century",
                "price": 8.95
            },
            { "category": "fiction",
                "author": "Evelyn Waugh",
                "title": "Sword of Honour",
                "price": 12.99
            },
            { "category": "fiction",
                "author": "Herman Melville",
                "title": "Moby Dick",
                "isbn": "0-553-21311-3",
                "price": 8.99
            },
            { "category": "fiction",
                "author": "J. R. R. Tolkien",
                "title": "The Lord of the Rings",
                "isbn": "0-395-19395-8",
                "price": 22.99
            }
        ],
        "bicycle": {
            "color": "red",
            "price": 19.95
        }
    }
}
''' AS x
)
SELECT 
    CUSTOM_JSON_EXTRACT(x, '$.store.book[*].author'),
    CUSTOM_JSON_EXTRACT(x, '$..*[?(@.price==22.99)].author'),
    CUSTOM_JSON_EXTRACT(x, '$..author'),
    CUSTOM_JSON_EXTRACT(x, '$.store.*'),
    CUSTOM_JSON_EXTRACT(x, '$.store..price'),
    CUSTOM_JSON_EXTRACT(x, '$..book[(@.length-1)]'),
    CUSTOM_JSON_EXTRACT(x, '$..book[-1:]'),
    CUSTOM_JSON_EXTRACT(x, '$..book[0,1]'),
    CUSTOM_JSON_EXTRACT(x, '$..book[:2]'),
    CUSTOM_JSON_EXTRACT(x, '$..book[?(@.isbn)]')
FROM t

Результат как показано ниже

Для CUSTOM_JSON_EXTRACT(x, '$.store.book[*].author')

[
  "Nigel Rees"
  "Evelyn Waugh"
  "Herman Melville"
  "J. R. R. Tolkien"
]

Для CUSTOM_JSON_EXTRACT(x, '$..*[?(@.price==22.99)].author')

[
  "J. R. R. Tolkien"
]  

Для CUSTOM_JSON_EXTRACT(x, '$.store..price')

[
  8.95
  12.99
  8.99
  22.99
  19.95
]
0 голосов
/ 20 июня 2018

К сожалению, я не достаточно ясно понял ваш вопрос.Как правило, есть два ответа на этот тип проблемы, насколько я понимаю.

Если у вас есть файл JSON, который вы хотите запросить с помощью BigQuery, вы можете просто импортировать файл в BigQuery изапрос это нормально.

Если вы имеете в виду, что у вас есть структура JSON, хранящаяся в виде строки в столбце, то невозможно получить нужный узел динамически только с помощью SQL-запроса, потому что вам нужно будет просмотреть объект JSON сязык сценариев или программирования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...