Импорт данных JSON в таблицу со схемой

#sql #json #apache-spark #apache-spark-sql

Вопрос:

Я храню объекты JSON в столбце (строке). Я хочу преобразовать его в таблицу со схемой.

JSON_DATA
{«id»:»ksah2132″,»connections»:{«structure»:[«123″,»456″,»789″]},»options»:[{«id»:»AA123″,»type»:»optionA»},{«id»:»BB123″,»type»:»optionB»},{«id»:»CC123″,»type»:»optionC»}]}
{«id»:»ksah3321″,»connections»:{«structure»:[«567″,»332″,»435″]},»options»:[{«id»:»AA133″,»type»:»optionA»},{«id»:»BB156″,»type»:»optionB»},{«id»:»CC445″,»type»:»optionC»}]}

Таблица со схемой:

 CREATE TABLE `sandboxabc.raw_data`(`options` array<struct<id:string,type:string>>, `connections` struct<structure:array<string>>, `id` string)
 

Как я могу использовать Spark SQL для вставки перезаписи в новую таблицу?
Мой код:

 INSERT OVERWRITE TABLE sandboxabc.structured_data
SELECT
    from_json (JSON_DATA,'$.options') AS options
    ,from_json (JSON_DATA,'$.connections') AS connections
    ,from_json (JSON_DATA,'$.id') AS id
FROM
    sandboxabc.raw_data
 

Образец вывода:

ID соединение вариант
ksah2132 {«структура»:[«123″,»456″,»789»]} [{«идентификатор»: «AA123″,»тип»:»Опция»},{«идентификатор»:»BB123″,»тип»:»Опция B»},{«идентификатор»:»CC123″,»тип»:»Опция C»}

Комментарии:

1. 1. Строка JSON_DATA неверна, для этого требуется еще одна открывающая и закрывающая фигурные скобки { } (одна в начале и одна в конце).

2. 2. Есть ли у вас данные в необработанной таблице, как показано в инструкции create, и вы хотите прочитать необработанную таблицу и передать ее в структурированном формате в «sttuctured_data» ? Затем вы можете опубликовать образец выходных данных structured_data, который вам нужен?

3. @Pradeepyadav Да, образец предоставлен..

Ответ №1:

Ниже приведен код spark-sql, который должен работать для вас. Обратите внимание, что поддержка улья должна быть включена, и связанные с ульем банки должны присутствовать в пути к классам.

 INSERT OVERWRITE TABLE sandboxabc.structured_data
  SELECT
    id,
    from_json(connection, "struct<structure:array<string>>") as connection,
    from_json(options, "array<struct<id:string,type:string>>") as options
      FROM (
        select
           get_json_object(JSON_DATA,'$.id') as id,
           get_json_object(JSON_DATA,'$.connection') as connection,
           get_json_object(JSON_DATA,'$.options') as options
      FROM sandboxabc.raw_data)