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, но, возможно, (субъективно!) легче смотреть.

Другие вопросы по тегам