Presto Unnest JSON
Следуя этому вопросу: как скрестить объединить и вставить массив JSON в Presto
Я попытался запустить предоставленный пример, но я получаю и ошибку при этом
команда SQL:
select x.n
from
unnest(cast(json_extract('{"payload":[{"type":"b","value":"9"},
{"type":"a","value":"8"}]}','$.payload') as array<varchar>)) as x(n)
ошибка, которую я получил:
Value cannot be cast to array<varchar>
java.lang.RuntimeException: java.lang.NullPointerException: string is null
2 ответа
SELECT JSON_EXTRACT('{"payload":[{"type":"b","value":"9"}, {"type":"a","value":"8"}]}','$.payload')
дает:
[{"type":"b","value":"9"}, {"type":"a","value":"8"}]
который ARRAY<MAP<VARCHAR,VARCHAR>>
, Вы можете изменить свой запрос на:
SELECT x.n
FROM
UNNEST (CAST(JSON_EXTRACT('{"payload":[{"type":"b","value":"9"},{"type":"a","value":"8"}]}','$.payload') AS ARRAY<MAP<VARCHAR, VARCHAR>>)) AS x(n)
Вы можете использовать JSON_EXTRACT,CAST и, наконец, UNNEST для соответствующих столбцов
SELECT type,value FROM
UNNEST(CAST(JSON_EXTRACT('{"payload":[{"type":"b","value":"9"},
{"type":"a","value":"8"}]}'
,'$.payload'
) as ARRAY(ROW(type VARCHAR, value VARCHAR)
)
)
) as x(type,value)
дает вывод, как показано ниже
type | value
------+-------
b | 9
a | 8
Одна из возможных интерпретаций возвращаемого типа данных заключается в следующем:
ARRAY<MAP<VARCHAR,VARCHAR>>
но имеет недостаток в том, что доступ к значениям на карте не может быть сделан с использованием точечной нотации.
Предполагается, что альтернативный тип данных будет таким:
ARRAY(ROW(type VARCHAR, value VARCHAR))
Что напоминает ARRAY<STRUCT<
Эквивалент типа данных улья.
Массивное отступление здесь >> JSON немного неоднозначно.
Который правильный? Является ли объект JSON представлением карты ( hashmap, словарь, пары ключ-значение, как бы это ни назывался в вашем языке) или это больше похоже на структуру (свойства объекта, класса, пакета имен, как бы это ни называл ваш язык)? Он происходит из JavaScript ( Object Notation), предназначенного для обслуживания массивов, объектов и примитивных типов, но более широкое использование означает, что он имеет неоднозначное отображение (ха) в других языках. Возможно, функционально эквивалентно, но в теории MAP
должно быть быстрее для случайного чтения / записи и ROW
возможно, есть некоторые дополнительные объектно-ориентированные накладные расходы, но все это реализовано в Java, где все равно является объектом, поэтому у меня нет ответа. Используйте все, что вам нравится. << Я отвлекся.
Вы нашли это немного многословным:
SELECT
x.n['type'] as "type",
x.n['value'] as "value"
FROM UNNEST (
CAST(
JSON_EXTRACT('{"payload":[{"type":"b","value":"9"},{"type":"a","value":"8"}]}'
,'$.payload')
AS ARRAY<MAP<VARCHAR, VARCHAR>>
)
)
AS x(n)
Вот альтернатива
SELECT
n.type,
n.value
FROM UNNEST(
CAST(
JSON_EXTRACT(
'{"payload":[{"type":"b","value":"9"},{"type":"a","value":"8"}]}'
,'$.payload'
)
as ARRAY(ROW(type VARCHAR, value VARCHAR))
)
) as x(n)
Это так же многословно; имена столбцов просто смещены к выражению CAST, но, возможно, (субъективно!) легче смотреть.