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 语句?

COPY INTO 雪花命令的语法错误

无法通过 Java 执行 Snowflake COPY 命令

雪花数据库:在 COPY INTO 语句中使用 VALIDATION_MODE 从外部阶段加载 JSON 文件

COPY命令在字符串值中使用逗号 - Postgresql 10

(Oracle) 在 Snowflake 中转换 us7ascii?