Redshift - 缺少结束引号的分隔值

5

我正在尝试将CSV文件加载到Redshift。

分隔符为“|”

CSV的第一列:

1 |Bhuvi|"This is ok"|xyz@domain.com

我使用了这个命令进行加载。
copy tbl from 's3://datawarehouse/source.csv'   
iam_role  'arn:aws:iam:::role/xxx'cas-pulse-redshift' 
delimiter '|' 
removequotes 
ACCEPTINVCHARS ; 

错误:

raw_field_value | This is ok" |xyz@domain.com
err_code        | 1214
err_reason      | Delimited value missing end quote

然后我也试了这个。
copy tbl from 's3://datawarehouse/source.csv'   
iam_role  'arn:aws:iam:::role/xxx' 
CSV QUOTE '\"' 
DELIMITER '|'   
ACCEPTINVCHARS ; 

在iam_role字符串的第一个查询中,可能有一个单引号太多了。我正在使用“凭据”配置与aws_access_key、aws_secret_access_key,并且我无法重现您的错误 :/ - Dolfa
1
当您尝试第二个COPY命令时发生了什么?您是否收到相同的错误?尝试使用CSV QUOTE AS '"'而不是转义反斜杠。 - Nathan Griffiths
我尝试运行第一个COPY命令,对我来说它运行得很好,我认为你的数据可能确实有一些缺少引号的行。该查询对我来说使用REMOVEQUOTES和不使用REMOVEQUOTES都可以工作。如果您想简单地忽略具有缺少双引号的行,则可以在COPY命令的末尾添加MAXERROR 10,这将在给出错误之前跳过最多10行损坏/无效数据。如果需要,您可以更改值“10”。 - Shailesh
1
转载到 https://dev59.com/nKTja4cB1Zd3GeqPAFZF - Craig Ringer
1个回答

1

免责声明 - 尽管这篇文章没有回答这里提出的问题,但我发布这篇分析是为了帮助某些人。

错误"Delimited value missing end quote"可能会在引用文本列缺少结束引号或者文本列值本身有换行符的情况下报告。在我的情况下,文本列值中有一个换行符。

根据RFC 4180的规范,CSV的规范如下:

包含换行符(CRLF)、双引号和逗号的字段应该用双引号括起来。
例如:

    "aaa","b CRLF
    bb","ccc" CRLF
    zzz,yyy,xxx

因此,一个有效的CSV文件可以有多行记录,在Redshift中正确导入的方法是指定CSV格式选项。这也假设所有包含引号字符的列在值中都会有另一个前置的引号字符进行转义。这也符合CSV RFC规范。

如果使用双引号来包围字段,那么字段内出现的双引号必须通过在其前面加上另一个双引号进行转义。
例如:

   "aaa","b""bb","ccc"

如果我们尝试导入的文件不是有效的CSV文件,只是以.CSV文件命名,那么我们有以下选项:

  1. 尝试在不指定CSV选项的情况下复制文件,并使用相应的复制选项微调分隔符、转义和引用行为。
  2. 如果一组选项无法始终复制数据,则预处理文件使其保持一致。

通常,如果我们尝试以一致的格式导出和导入数据,可以使行为确定性更好。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接