Snowflake新增默认值列后ADF复制活动导入文本文件报错如何解决
ADF复制3列数据到含默认值列的4列Snowflake表的解决方案
报错的核心原因:默认配置下ADF复制活动会执行全表列匹配校验,不会主动忽略设置了默认值的INSERT_DTS列,导致源3列和目标4列的校验不通过,可通过以下方案解决:
方案1:手动配置ADF复制活动列映射(最简便,推荐优先使用)
进入复制活动的映射配置页,关闭自动映射开关,手动将源文本文件的3个字段依次匹配到Snowflake表的SCENARIO、YEAR、PERIOD三个列,不需要给INSERT_DTS列配置任何映射关系。执行复制时未映射的INSERT_DTS会自动触发Snowflake的默认值规则填充CURRENT_TIMESTAMP()。方案2:指定目标插入列,使用Snowflake COPY INTO命令导入
适合大文件批量导入场景,操作步骤:先通过ADF将文本文件上传到Snowflake关联的内部/外部Stage,再执行SQL命令:
COPY INTO TEST_DB.STG_TEST.HFM_STG (SCENARIO, YEAR, PERIOD) FROM @你的Stage路径/目标文本文件名 FILE_FORMAT = (TYPE = 'CSV' /*补充你需要的其他文件格式参数*/);
命令中明确指定仅插入前3个列,剩余列自动走默认值,可规避列数校验问题。
- 方案3:创建仅包含待插入列的Snowflake视图作为复制目标
在Snowflake中创建基于目标表的视图:
CREATE OR REPLACE VIEW TEST_DB.STG_TEST.HFM_STG_INSERT_VIEW AS SELECT SCENARIO, YEAR, PERIOD FROM TEST_DB.STG_TEST.HFM_STG;
将ADF复制活动的目标表修改为上述视图,源3列和视图3列可正常匹配,插入数据时基表的INSERT_DTS会自动填充默认值。
额外注意:你提供的建表语句中默认值关键字拼写错误,DEFUALT需要改为DEFAULT,否则默认值规则不会生效,修正后的建表语句如下:
create or replace TABLE TEST_DB.STG_TEST.HFM_STG ( SCENARIO VARCHAR(50), YEAR VARCHAR(4), PERIOD VARCHAR(3), INSERT_DTS TIMESTAMP DEFAULT CURRENT_TIMESTAMP() );
内容的提问来源于stack exchange,提问作者Nanda
相关产品推荐
相关产品推荐

