0

我正在尝试将 STRING 类型列插入到 STRUCT TYPE 列的 ARRAY 中,但遇到错误。您能否帮助提供正确的插入方向。

在 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'

原始表填充了以下值:例如。

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: cannot resolve 'spark_catalog.raw_lms.rawTable. PrimaryOwners' 由于数据类型不匹配:无法将字符串转换为数组<struct<Id:string>>;

我不想爆炸数据。我只需要简单地为不同列数据类型之间的行插入rawTabletransformedTable

感谢您的时间和帮助。

4

1 回答 1

1

正如错误消息所述,您不能将字符串作为数组插入。您需要使用arraynamed_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
于 2022-01-31T12:12:39.553 回答