Snowflake COPY INTO 在数据值中的双引号值上失败
Posted
技术标签:
【中文标题】Snowflake COPY INTO 在数据值中的双引号值上失败【英文标题】:Snowflake COPY INTO fails on double quote value in a data value 【发布时间】:2020-05-17 16:36:29 【问题描述】:由于在数据值中发现双引号,COPY INTO 失败。 C 周围的两个双引号导致失败 -> NE 845 "C" Street。
确切的错误信息是:
找到字符 'H' 而不是字段分隔符 '|~' 文件 '@~/FolderX/datafile.dat.gz',第 1 行,第 107 行,第 274598 行,列 "MY_TABLE"["BADCOLUMN":20] 如果您想继续加载时 遇到错误,请使用其他值,例如“SKIP_FILE”或 ON_ERROR 选项的“CONTINUE”。有关加载的更多信息 选项,请在 SQL 客户端中运行 'info loading_data'。
格式文件定义为:
CREATE FILE FORMAT "DW"."STG".FMT_FILE
COMPRESSION = 'GZIP'
FIELD_DELIMITER = '|~'
RECORD_DELIMITER = '\n'
SKIP_HEADER = 0
FIELD_OPTIONALLY_ENCLOSED_BY = '\042'
TRIM_SPACE = TRUE
ERROR_ON_COLUMN_COUNT_MISMATCH = FALSE
ESCAPE = '#'
ESCAPE_UNENCLOSED_FIELD = 'NONE'
DATE_FORMAT = 'AUTO'
TIMESTAMP_FORMAT = 'AUTO'
ENCODING = 'WINDOWS1253'
NULL_IF = ('\\N');
当数据为时,为什么要关心任何值中是否存在双引号:
123|~NE 845 "C" Street|~PULLMAN
鉴于格式文件的定义,应该没有必要在任何字符串中添加转义符。这个失败似乎是一个错误。
【问题讨论】:
【参考方案1】:这不是错误。当您使用此语句 FIELD_OPTIONALLY_ENCLOSED_BY = '\042'
时,您已明确要求 Snowflake 将双引号识别为在文件中包含值的一种方式。如果您从文件格式中删除(或更改为 NONE
),则不应收到您收到的错误。不过,Snowflake 的行为符合预期。
【讨论】:
Snowflake 使用 ASCII 八进制 42,MSFT 世界使用 ASCII 十进制。查看 ASCII 表让我期待代码抱怨星号而不是双引号。谢谢!以上是关于Snowflake COPY INTO 在数据值中的双引号值上失败的主要内容,如果未能解决你的问题,请参考以下文章
是否可以在 csv 中包含列名以及 Snowflake 中的 copy into 语句?
无法通过 Java 执行 Snowflake COPY 命令
雪花数据库:在 COPY INTO 语句中使用 VALIDATION_MODE 从外部阶段加载 JSON 文件