在Amazon Redshift COPY命令中转义分隔符

时间:2017-03-10 14:09:14

标签: amazon-web-services amazon-s3 amazon-redshift

我正在将Amazon S3中的数据提取到Amazon Redshift中的表中。该表包含各种列,其中某些列数据可能包含特殊字符。

copy命令有一个名为Delimiter的选项,我们可以在将数据拉入表格的同时指定分隔符。

问题是2折 -

当我使用分隔符将(unload command)导出到S3时 - 比如, - 它工作正常,但是当我尝试从S3导入Redshift时,问题就会出现,因为某些列包含', '运算符,复制命令错误解释为分隔符并抛出错误。

我尝试了各种分隔符,但是我的表中的数据似乎包含一些或其他类型的特殊字符,这会引起上述问题。

我甚至尝试使用多个分隔符进行卸载 - 例如#%~,但是当使用复制命令从s3加载时 - 不支持双分隔符。

任何解决方案?

我认为分隔符可以使用\进行转义,但由于某种原因,它也无效,或者我可能没有使用正确的语法来复制命令中的转义。

3 个答案:

答案 0 :(得分:2)

以下示例显示文本文件的内容,其中字段值以逗号分隔。

12,Shows,Musicals,Musical theatre
13,Shows,Plays,All "non-musical" theatre  
14,Shows,Opera,All opera, light, and "rock" opera
15,Concerts,Classical,All symphony, concerto, and choir concerts

如果使用DELIMITER参数加载文件以指定逗号分隔的输入,则COPY命令将失败,因为某些输入字段包含逗号。您可以使用CSV参数并在引号字符中包含逗号的字段来避免该问题。如果引号字符出现在带引号的字符串中,则需要通过将引号字符加倍来转义它。默认引号字符是双引号,因此您需要使用额外的双引号来转义每个双引号。您的新输入文件将如下所示。

12,Shows,Musicals,Musical theatre
13,Shows,Plays,"All ""non-musical"" theatre"
14,Shows,Opera,"All opera, light, and ""rock"" opera"
15,Concerts,Classical,"All symphony, concerto, and choir concerts"


来源: - Load Quote from a CSV File


我用的是什么 -

COPY tablename FROM 'S3-Path' CREDENTIALS '' MANIFEST CSV QUOTE '\"' DELIMITER ',' TRUNCATECOLUMNS ACCEPTINVCHARS MAXERROR 2

如果我做了一个错误的假设请发表评论,我会重新调整我的答案。

答案 1 :(得分:0)

如果分隔符出现在字段中,请将ADDQUOTES参数与UNLOAD command一起使用:

  

在每个卸载的数据字段周围放置引号,以便Amazon Redshift可以卸载包含分隔符本身的数据值。

然后:

  

如果使用ADDQUOTES,则必须在COPY中指定REMOVEQUOTES,如果重新加载数据。

流行的分隔符是管道符(|),在文本文件中很少见。

答案 2 :(得分:0)

在DELIMITER为我工作之前添加CSV QUOTE as '\"'