Используя Presto SQL, исходный формат столбца выглядит следующим образом "{\"ORDERS (completed)\": 1000.00, \"ORDERS (failed) USD\": 3000.00}"
, и я пытаюсь извлечь ключ и значение путем анализа и приведения к карте (varchar, double), а затем отсоединения
UNNEST(
CAST(JSON_PARSE(json) as MAP<VARCHAR, DOUBLE>)
) x(key, value)
Когда я использую json_parse
, косая черта и кавычки исчезают, но я получаю сообщение об ошибке (ожидается объект json) при попытке привести к map<varchar, double>
{"ORDERS (filled)": 1000.00, "ORDERS (succeeded) USD": 3000.00}
Я также пробовал использовать формат JSON, но получил аналогичную ошибку.
"{\"ORDERS (completed) USD\": 1000.0}" "\"{\\\"ORDERS (failed) USD\\\": 3000.0}\""
Решение моей проблемы:
cast(json_parse(replace(substr(col, 2, length(col) - 2), '\', '')) as map<varchar, double>)
Мы хотим быть осторожными и не удалять все двойные кавычки, чтобы json_parse
работал, нам нужны только двойные кавычки, окружающие строку json. Поэтому мы используем substr(col, 2, length(col) - 2)
, чтобы получить строку внутри кавычек. Нам нужно будет заменить косую черту на '', чтобы json_parse
конвертировалось в json. Тогда мы можем использовать json_parse
и cast as map<type, type>
как обычно.
Ваш JSON — это строка, содержащая закодированный JSON (по сути, это JSON с двойной кодировкой), поэтому ее однократный анализ не поможет. Более правильным подходом было бы выполнить двойной анализ:
with dataset(col) as (
values ('"{\"ORDERS (completed)\": 1000.00, \"ORDERS (failed) USD\": 3000.00}"')
)
select cast(
json_parse(
json_extract_scalar(
json_parse(col), '$')) as map(varchar, double))
from dataset;
Что дает следующий результат:
_col0
---------------------------------------------------------
{ORDERS (failed) USD=3000.0, ORDERS (completed)=1000.0}
это сработало и определенно лучшее решение, чем то, что я сделал, большое спасибо!