Snowflake外部表加载Azure Blob CSV遇单元格含逗号问题咨询
解决方案:处理含内部逗号的CSV加载问题
核心问题是CSV文件中单元格内嵌逗号导致默认的逗号分隔逻辑错误拆分字段,以下是两种场景下的处理方案,无需修改源CSV文件:
场景1:含逗号的单元格已用双引号包裹(标准CSV格式)
这是最常见的合规CSV场景,只需调整Snowflake的文件格式,让它识别双引号作为字段包裹符,自动忽略引号内的逗号:
步骤1:更新现有CSV文件格式
执行SQL修改你的FF_TEST_CSV_P文件格式,添加引号识别配置:
ALTER FILE FORMAT ANALYTICSLAYER.AN_MEDALLIA_P.FF_TEST_CSV_P SET QUOTE = '"' -- 指定双引号为字段包裹符 ESCAPE = '"' -- 若CSV中用双引号转义内部双引号(比如""表示一个"),必须设置此参数 ERROR_ON_COLUMN_COUNT_MISMATCH = FALSE; -- 可选,避免列数临时不匹配直接触发报错
步骤2:验证外部表
修改文件格式后,直接查询外部表即可验证字段是否正确识别:
SELECT * FROM ANALYTICSLAYER.AN_MEDALLIA_P.EXT_DIM_APP_TRAINING_SURVEY LIMIT 10;
场景2:含逗号的单元格未用引号包裹(非标准CSV)
这种情况没有标准分隔符可依赖,需要通过字符串处理函数手动解析每一列:
方案:在外部表列定义中用正则提取字段
修改外部表的列定义,用REGEXP_SUBSTR函数匹配"非逗号字符"或"被双引号包裹的内容",跳过单元格内的逗号。示例如下:
CREATE OR REPLACE EXTERNAL TABLE ANALYTICSLAYER.AN_MEDALLIA_P.EXT_DIM_APP_TRAINING_SURVEY ( "Col1" VARCHAR AS REGEXP_SUBSTR(value, '^(?:[^,]|(?:".*?"))*', 1, 1), "Col2" VARCHAR AS REGEXP_SUBSTR(value, '(?:,)(?:[^,]|(?:".*?"))*', 1, 1, 'e'), "Col3" VARCHAR AS REGEXP_SUBSTR(value, '(?:,)(?:[^,]|(?:".*?"))*', 1, 2, 'e'), "Col4" VARCHAR AS REGEXP_SUBSTR(value, '(?:,)(?:[^,]|(?:".*?"))*', 1, 3, 'e'), "Col5" VARCHAR AS REGEXP_SUBSTR(value, '(?:,)(?:[^,]|(?:".*?"))*', 1, 4, 'e'), "Col6_DATE" VARCHAR AS REGEXP_SUBSTR(value, '(?:,)(?:[^,]|(?:".*?"))*', 1, 5, 'e'), "Col7" VARCHAR AS REGEXP_SUBSTR(value, '(?:,)(?:[^,]|(?:".*?"))*', 1, 6, 'e') ) WITH LOCATION=@ST_TESTAZURE_P AUTO_REFRESH = true FILE_FORMAT = (TYPE = CSV FIELD_DELIMITER = ',' SKIP_HEADER = 1) -- 直接指定基础格式,避免依赖原有配置 PATTERN='.*DIM_TEST_FILE_DATA.csv';
注:如果CSV有特殊格式(比如用其他字符包裹字段),需要根据实际情况调整正则规则。
额外验证建议
如果不确定CSV格式细节,可以先执行以下命令查看原始行内容,确认字段包裹情况后再选择对应方案:
-- 查看存储仓中的文件列表 LIST @ST_TESTAZURE_P PATTERN='.*DIM_TEST_FILE_DATA.csv'; -- 查看文件前10行原始内容 SELECT $1 FROM @ST_TESTAZURE_P/DIM_TEST_FILE_DATA.csv LIMIT 10;
内容的提问来源于stack exchange,提问作者Shruti
相关产品推荐
相关产品推荐

