Snowflake执行CSV格式COPY INTO加载报错:出现':'而非字段分隔符','
问题根因
指定file_format=CSV仅代表Snowflake会按照CSV格式规则解析扫描到的文件,不会自动过滤非CSV格式的文件。
从报错信息可以看到,当前加载任务正在尝试解析citibike-trips-json/路径下的.json.gz后缀JSON文件:JSON结构使用:分隔键和值,和CSV格式配置的,字段分隔符规则不匹配,因此触发分隔符不匹配报错,和你配置的CSV格式参数本身无关。
教程中操作可以正常执行的核心原因是教程使用的stage路径下仅存放了CSV文件,不存在多格式混放的情况。
可落地解决方案
- 方案1:加载时通过文件后缀规则过滤,仅加载CSV文件(适配当前混放场景,改造成本最低)
在COPY INTO语句中添加PATTERN参数,通过正则匹配仅选中CSV后缀的文件,自动跳过JSON、Parquet等其他格式文件,示例命令:
如果你使用的是未压缩的CSV文件,将匹配规则改为-- 匹配gzip压缩的CSV文件 copy into trips from @citibike_trips file_format=CSV PATTERN => '.*[.]csv[.]gz';'.*[.]csv'即可。 - 方案2:按格式拆分stage存储路径(长期使用推荐,性能最优)
将stage下不同格式的文件移动到独立子目录,比如CSV文件统一存放至@citibike_trips/csv/、JSON文件存放至@citibike_trips/json/、Parquet文件存放至@citibike_trips/parquet/,加载时直接指定对应格式的子路径即可,不需要额外做正则匹配,加载性能更高:copy into trips from @citibike_trips/csv/ file_format=CSV; - 方案3:配置错误跳过规则(仅临时测试使用,不推荐生产环境配置)
如果只是临时验证加载逻辑,可以添加ON_ERROR='SKIP_FILE'参数,遇到解析失败的文件自动跳过,但该配置会无差别跳过所有解析报错的文件,可能漏过存在格式问题的合法CSV文件,存在数据漏载风险:copy into trips from @citibike_trips file_format=CSV ON_ERROR = 'SKIP_FILE';
前置排查步骤
正式执行加载前,可以先执行如下命令查看stage下的全量文件列表,确认CSV文件的实际存储路径、后缀格式,避免扫描无关文件:
LIST @citibike_trips;
内容的提问来源于stack exchange,提问作者Siver R
相关产品推荐
相关产品推荐

