首页 > 解决方案 > 雪花 - 期待 VARIANT 但使用 MERGE 获得 VARCHAR 列

问题描述

我见过类似的问题,我无法将其应用于我的案例。

尝试从 s3 文件合并到表时,我看到以下错误。(另外,我已经删除了这个表,因为以前我确实有这个monthly_budgets 列作为一个varchar,但它是一个看起来像这样的嵌套列[{id:0, etc.}])并且我需要取消嵌套,我相信我只能在它是一个变体列时这样做,这里是错误:

snowflake.connector.errors.ProgrammingError: 002023 (22000): 019c66f5-0602-3d9f-0000-01b526f2feb2: SQL 编译错误: 表达式类型与列数据类型不匹配,期望 VARIANT 但得到 VARCHAR(16777216) 列 MONTHLY_BUDGETS

这些是我的疑问:

CREATE TABLE IF NOT EXISTS my_table (
line_name string,
io_id integer,
monthly_budgets variant
            )

我正在做这个合并:

MERGE INTO my_schema.my_table AS m
USING (
    SELECT  $1 AS col1, $2 AS col2, $3 AS col3
    FROM @luigi.items.csv (file_format => 'my_schema.my_table')
) AS s
ON m.io_idid = s.col2
WHEN MATCHED
THEN UPDATE SET m.line_name = s.col1, m.io_id = s.col2, m.monthly_budgets = s.col3
WHEN NOT MATCHED
THEN INSERT (line_name, io_id, monthly_budgets) VALUES (s.col1, s.col2, s.col3);

标签: snowflake-cloud-data-platform

解决方案


如果 s.col3 是 CSV 文件中的 JSON,那么您应该能够使用 parse_json 函数将其转换为 JSON 变体:

MERGE INTO my_schema.my_table AS m
USING (
    SELECT  $1 AS col1, $2 AS col2, $3 AS col3
    FROM @luigi.items.csv (file_format => 'my_schema.my_table')
) AS s
ON m.io_idid = s.col2
WHEN MATCHED
THEN UPDATE SET m.line_name = s.col1, m.io_id = s.col2, m.monthly_budgets = parse_json(s.col3)
WHEN NOT MATCHED
THEN INSERT (line_name, io_id, monthly_budgets) VALUES (s.col1, s.col2, parse_json(s.col3));

如果没有样本数据,我无法对此进行测试,但如果 s.col3 是具有有效 JSON 数据的字符串,它应该可以工作。


推荐阅读