snowflake-cloud-data-platform - 雪花 - 期待 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);
解决方案
如果 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 数据的字符串,它应该可以工作。
推荐阅读
- scala - 用于更好地链接收集的功能模式
- angular - ng2-nouislider 格式范围负载角 9
- machine-learning - 使用 doc2vec 查询文档相似度
- ios - 参数类型不符合预期的类型 MKAnnotation
- reactjs - 在 react 中从 formik 向 Firestore 提交数据
- javascript - 在 Javascript 中创建一个唯一的数组
- highcharts - Highcharts - 如果条形图上没有足够的空间,则更改文本颜色
- python - 如何根据访问频率将回访用户分类到不同的时间段
- docker - 通过 docker 镜像安装 jfrog 容器注册表的问题
- azure-active-directory - 通过订阅获取 Azure 应用程序