使用COPY INTO命令向Snowflake加载CSV文件报错问题咨询
报错原因
这个报错的核心是加载的CSV文件与目标表结构不匹配,具体对应两个问题:
预期解析列"VEGETABLE_DETAILS_PLANT_HEIGHT"["HIGH_END_OF_RANGE":5]时已到达记录末尾
- CSV中第3、8行的字段数少于目标表的5个字段,读取到第5列
HIGH_END_OF_RANGE时没有对应数据 - 隐藏适配问题:你定义的
PLANT_NAME字段长度为text(7),但CSV中存在超过7个字符的植物名(比如Eggplant共8个字符),列数问题解决后也会触发字段截断报错
解决方案
方案1:调整表结构+修改加载参数(推荐)
- 调整表字段长度适配数据,避免截断:
create or replace table VEGETABLE_DETAILS_PLANT_HEIGHT ( PLANT_NAME text, VEG_HEIGHT_CODE text(1), UNIT_OF_MEASURE text(2), LOW_END_OF_RANGE number(2), HIGH_END_OF_RANGE number(2) );
如果需要保留字段长度限制,可将PLANT_NAME调整为text(20)即可覆盖所有植物名称长度。
- 修改COPY INTO命令,添加列数不匹配适配和错误处理规则:
copy into vegetable_details_plant_height from @like_a_window_into_an_s3_bucket files = ( 'veg_plant_height.csv') file_format = ( format_name=VEG_CHALLENGE_CC ERROR_ON_COLUMN_COUNT_MISMATCH = FALSE EMPTY_FIELD_AS_NULL = TRUE ) ON_ERROR = 'CONTINUE';
参数说明:
ERROR_ON_COLUMN_COUNT_MISMATCH = FALSE:关闭列数不匹配直接终止加载的规则EMPTY_FIELD_AS_NULL = TRUE:空字段自动填充为NULL存入表中ON_ERROR = 'CONTINUE':遇到错误行时跳过错误行,继续加载其他正常行,也可根据需求替换为SKIP_FILE直接跳过整个错误文件
- 加载完成后可执行以下命令查看错误行详情:
select * from table(information_schema.copy_history( table_name=>'VEGETABLE_DETAILS_PLANT_HEIGHT', start_time=> dateadd(hours, -1, current_timestamp()) ));
方案2:预处理CSV文件
如果你需要加载所有行,可提前修改CSV文件,给第3、8行缺失的HIGH_END_OF_RANGE列补充空值或默认数值,再重新上传到S3执行加载即可。
内容的提问来源于stack exchange,提问作者4everMe
相关产品推荐
相关产品推荐

