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
Другие вопросы по тегам