Ошибка при попытке получить переменную pathsname: JSONPath должен быть строковым литералом или параметром запроса - PullRequest
1 голос
/ 29 апреля 2019

Я пытаюсь использовать JSON_EXTRACT в Bigquery с JSONPATH, который не всегда одинаков.

Так что мой L.key - это всегда другое ключевое слово (которое у меня в таблице2).К сожалению, concat с JSON_EXTRACT не работает для меня.
Если я использую concat один, без JSON_EXTRACT, он работает.

Это код, который я использую:

SELECT A.*, SAFE_CAST(REPLACE(JSON_EXTRACT(A.some_json_obj, concat("$.", L.key)), '\"', '') AS NUMERIC) AS obp 
FROM table1 A, table2 L 
WHERE A.name = L.name

1 Ответ

0 голосов
/ 20 июля 2019

Ниже для BigQuery Standard SQL

Чтобы обойти «ограничение» BigQuery для JsonPath, вы можете использовать пользовательскую функцию, как показано в следующем примере:

#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) { returnnull }
"""
OPTIONS (
    library="gs://your_bucket/jsonpath-0.8.0.js"
);
SELECT A.*, 
  SAFE_CAST(REGEXP_REPLACE(CUSTOM_JSON_EXTRACT(A.some_json_obj, CONCAT("$.", L.key)), r'["\[\]]', '') AS NUMERIC) AS obp 
FROM table1 A, table2 L 
WHERE A.name = L.name

Примечание: вам нужно скачать jsonpath-0.8.0.js из https://code.google.com/archive/p/jsonpath/downloads и загрузите его в корзину Google Cloud Storage - в этом примере он обозначается как gs: //your_bucket/jsonpath-0.8.0.js

ДляНапример, если применить к ниже упрощенным фиктивным данным

WITH table1 AS (
  SELECT 1 name, '{"x":1, "y":"2"}' some_json_obj
), table2 AS (
  SELECT 1 name, 'x' key UNION ALL
  SELECT 1, 'y'
)

, результат будет

Row name    some_json_obj       obp  
1   1       {"x":1, "y":"2"}    1    
2   1       {"x":1, "y":"2"}    2    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...