我正在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报价格式
看来\和{}导致了我的列值中存在问题。
有没有解决此问题的方法?
答案 0 :(得分:0)
问题在于您的数据包含"
个字符,并且这是QUOTE
中COPY ... CSV ...
个字符的默认值(请参见documentation)。
看起来您的数据是JSON,并且充满了,
和"
字符,并且既不引用也不转义。我相信您必须修改CSV文件才能加载该文件,因为当前Redshift(没有其他人)可以区分JSON中的定界符,
与,
。
正如您将在下面阅读的,有多个如何构造csv文件的选项,但是它立即显示出该文件格式用于存储数据的所有缺点-例如,它可能比JSON更为简洁,但会带来很多问题一旦您存储更复杂的内容。阅读我的建议后,请考虑将文件格式也更改为。 JSON与 qouting 相比具有更清晰的语义。
我认为您的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"}"
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' ;"
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
命令。
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' ;"