我正在将Amazon S3中的数据提取到Amazon Redshift中的表中。该表包含各种列,其中某些列数据可能包含特殊字符。
copy命令有一个名为Delimiter
的选项,我们可以在将数据拉入表格的同时指定分隔符。
问题是2折 -
当我使用分隔符将(unload command)
导出到S3时 - 比如,
- 它工作正常,但是当我尝试从S3导入Redshift时,问题就会出现,因为某些列包含', '运算符,复制命令错误解释为分隔符并抛出错误。
我尝试了各种分隔符,但是我的表中的数据似乎包含一些或其他类型的特殊字符,这会引起上述问题。
我甚至尝试使用多个分隔符进行卸载 - 例如#%
或~,
但是当使用复制命令从s3加载时 - 不支持双分隔符。
任何解决方案?
我认为分隔符可以使用\
进行转义,但由于某种原因,它也无效,或者我可能没有使用正确的语法来复制命令中的转义。
答案 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 '\"'
。