spark sql Вставить строковый столбец в структуру столбца типа массива
Я пытаюсь вставить столбец типа STRING в столбец ARRAY of STRUCT TYPE, но сталкиваюсь с ошибками. Не могли бы вы помочь указать правильное направление для выполнения INSERT.
В блокноте databricks у меня есть необработанная таблица (
raw_lms.rawTable
), где все столбцы строкового типа. Это нужно вставить в таблицу преобразования (
tl_lms.transformedTable
), где столбцы представляют собой массив структурного типа.
CREATE TABLE raw_lms.rawTable
( PrimaryOwners STRING
,Owners STRING
)
USING DELTA LOCATION 'xxxx/rawTable'
CREATE TABLE tl_lms.transformedTable
( PrimaryOwners array<struct<Id:STRING>>
,Owners array<struct<Id:STRING>>
)
USING DELTA LOCATION 'xxxx/transformedTable'
Необработанная таблица содержит следующие значения: Eg.
INSERT INTO TABLE raw_lms.rawTable
VALUES
("[{'Id': '1393fe1b-bba2-4343-dff0-08d9dea59a03'}, {'Id': 'cf2e6549-5d07-458c-9d30-08d9dd5885cf'}]",
"[]"
)
Я пытаюсь вставить в таблицу преобразования и получаю следующую ошибку:
INSERT INTO tl_lms.transformedTable
SELECT PrimaryOwners,
Owners
FROM raw_lms.rawTable
Ошибка в операторе SQL: AnalysisException: невозможно разрешить 'spark_catalog.raw_lms.rawTable.
PrimaryOwners
' из-за несоответствия типов данных: невозможно привести строку к массиву<struct<Id:string>>;
Я не хочу взрывать данные. Мне нужно просто вставить строку для строки между
rawTable
и
transformedTable
различных типов данных столбца.
Спасибо за ваше время и помощь.
1 ответ
Как указано в сообщениях об ошибках, вы не можете вставить строку как массив. Вам нужно использоватьarray
а такжеnamed_struct
функции.
Измените тип необработанной таблицы на правильный тип и типы, а не строки, и попробуйте следующее:
INSERT INTO TABLE raw_lms.rawTable
VALUES
(array(named_struct('id', '1393fe1b-bba2-4343-dff0-08d9dea59a03'), named_struct('id', 'cf2e6549-5d07-458c-9d30-08d9dd5885cf')),
null
);
Или, если вы хотите сохранить столбцы в виде строки в необработанной таблице, используйтеfrom_json
для разбора строк в правильный тип перед вставкой:
INSERT INTO tl_lms.transformedTable
SELECT from_json(PrimaryOwners, 'array<struct<Id:STRING>>'),
from_json(Owners, 'array<struct<Id:STRING>>')
FROM raw_lms.rawTable