【问题标题】:spark sql Insert string column to struct of array type columnspark sql 将字符串列插入到数组类型列的结构中
【发布时间】:2022-01-31 20:17:01
【问题描述】:

我正在尝试将 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:无法解析 'spark_catalog.raw_lms.rawTable.PrimaryOwners' 由于数据类型 不匹配:无法将字符串转换为数组>;

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

感谢您的时间和帮助。

【问题讨论】:

    标签: sql apache-spark hive apache-spark-sql databricks-sql


    【解决方案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
    

    【讨论】:

    • 非常感谢。 from_json 示例解决了这个问题。
    猜你喜欢
    • 2017-11-03
    • 2019-08-05
    • 2016-05-19
    • 2021-12-14
    • 1970-01-01
    • 2021-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多