#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)