1214:使用COPY命令将数据从cvs导入Redshift时,CSV的报价格式无效

时间:2019-04-16 14:10:33

标签: amazon-web-services amazon-redshift

我正在COPY命令下面运行,以将数据从CVS导入Redshift并出现错误:

psql -w -U user1 -h host1 db1 --port 123 -c \
    "COPY table1 FROM 's3://bucket1/table1.csv' \  
     credentials 'aws_access_key_id=aaaaa;aws_secret_access_key=aaaa' \
     IGNOREHEADER 1 \
     csv NULL AS 'NULL' ;"
  

错误:加载到表“ rainlab_translate_attributes”失败。查看“ stl_load_errors”系统表以了解详细信息。

当我检查stl_load_errors时,我可以看到:

  

1214无效的CSV报价格式
  看来\和{}导致了我的列值中存在问题。

有没有解决此问题的方法?

1 个答案:

答案 0 :(得分:0)

问题在于您的数据包含"个字符,并且这是QUOTECOPY ... CSV ...个字符的默认值(请参见documentation)。

看起来您的数据是JSON,并且充满了,"字符,并且既不引用也不转义。我相信您必须修改CSV文件才能加载该文件,因为当前Redshift(没有其他人)可以区分JSON中的定界符,,

正如您将在下面阅读的,有多个如何构造csv文件的选项,但是它立即显示出该文件格式用于存储数据的所有缺点-例如,它可能比JSON更为简洁,但会带来很多问题一旦您存储更复杂的内容。阅读我的建议后,请考虑将文件格式也更改为。 JSON与 qouting 相比具有更清晰的语义。

如何使用CSV进行工作

我认为您的CSV数据如下:

"1","app.name","{"x":"app.name","en":"dfgdggfdfdd","de":"dfdddffgf Entwicklerportal","ja":"fgdfgdfg\\\\dfgfdd\\\\fdfg\\\\gfdgf\\\\gfdgd\\\\fdgdf\\\\gfgfdg\\\\dgdfg","zh-gfdd":"gdfgdgd\\\\gfgd\\\\gfdgd\\\\fgdfdf\\\\dgfdgfd\\\\gdfgdf\\\\dgdfgfd"}"

选项1-使用不同的QUOTE字符:

例如,将backtick用作QUOTE,将数据更改为如下所示:

`1`,`app.name`,`{"x":"app.name","en":"dfgdggfdfdd","de":"dfdddffgf Entwicklerportal","ja":"fgdfgdfg\\\\dfgfdd\\\\fdfg\\\\gfdgf\\\\gfdgd\\\\fdgdf\\\\gfgfdg\\\\dgdfg","zh-gfdd":"gdfgdgd\\\\gfgd\\\\gfdgd\\\\fgdfdf\\\\dgfdgfd\\\\gdfgdf\\\\dgdfgfd"}`

您不必引用所有字段,只需包含,的字段即可。

并使用以下COPY命令:

psql -w -U user1 -h host1 db1 --port 123 -c \
    "COPY table1 FROM 's3://bucket1/table1.csv' \  
     credentials 'aws_access_key_id=aaaaa;aws_secret_access_key=aaaa' \
     IGNOREHEADER 1 \
     CSV QUOTE AS '`' 
     NULL AS 'NULL' ;"

选项2-转义您的QUOTE字符:

将数据更改为以下格式:

"1","app.name","{""x"":""app.name"",""en"":""dfgdggfdfdd"",""de"":""dfdddffgf Entwicklerportal"",""ja"":""fgdfgdfg\\\\dfgfdd\\\\fdfg\\\\gfdgf\\\\gfdgd\\\\fdgdf\\\\gfgfdg\\\\dgdfg"",""zh-gfdd"":""gdfgdgd\\\\gfgd\\\\gfdgd\\\\fgdfdf\\\\dgfdgfd\\\\gdfgdf\\\\dgdfgfd""}"

这样,您可以弄清楚引号字段的结束位置。然后,您可以使用原始的COPY命令。

选项3-使用数据中不存在的DELIMITER

然后,您无需报价。例如使用|作为分隔符

将数据更改为以下格式:

1|app.name|{"x":"app.name","en":"dfgdggfdfdd","de":"dfdddffgf Entwicklerportal","ja":"fgdfgdfg\\\\dfgfdd\\\\fdfg\\\\gfdgf\\\\gfdgd\\\\fdgdf\\\\gfgfdg\\\\dgdfg","zh-gfdd":"gdfgdgd\\\\gfgd\\\\gfdgd\\\\fgdfdf\\\\dgfdgfd\\\\gdfgdf\\\\dgdfgfd"}

并使用以下COPY命令:

psql -w -U user1 -h host1 db1 --port 123 -c \
    "COPY table1 FROM 's3://bucket1/table1.csv' \  
     credentials 'aws_access_key_id=aaaaa;aws_secret_access_key=aaaa' \
     IGNOREHEADER 1 \
     CSV QUOTE AS '`' 
     DELIMITER AS '|'
     NULL AS 'NULL' ;"