1214:使用 COPY 命令将数据从 csv 导入 Redshift 时 CSV 的报价格式无效
Posted
技术标签:
【中文标题】1214:使用 COPY 命令将数据从 csv 导入 Redshift 时 CSV 的报价格式无效【英文标题】:1214: Invalid quote formatting for CSV while importing data from cvs to Redshift using COPY command 【发布时间】:2019-04-16 14:10:32 【问题描述】:我在 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 的引用格式无效 似乎 \ 和 导致了我的列值中存在的问题。
此类问题有解决办法吗?
【问题讨论】:
你的表的架构是什么?您能否也显示来自stl_load_errors
的完整行?
102 0 203319 2019-04-16 13:10:48 22855 2127330 s3://bucket1/table1.csv 2 message_data varchar 65535 6 "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""1214 CSV 引用格式无效
这是来自 stl_load_errors 的全部错误
【参考方案1】:
问题是您的数据包含"
字符,这是COPY ... CSV ...
中QUOTE
字符的默认值(请参阅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' ;"
【讨论】:
我的数据看起来像 - "1","cc","1","abc\\Content\\search\\exam",""title":"FAQ","description ":""" 我的 CSV 文件中有数千条记录,我现在很难更改数据格式,如何解决上述格式的问题? 您无法修复它。这就是 CSV 的美妙之处。自己试试 - 用逗号分割你的数据,看看会发生什么。或者,将".."
中包含的数据视为一个值。
我试图包含分隔符 |在 CVS 文件中并包含 DELIMITER AS '|',这很有效。
现在的问题是我无法从 AWS RDS 生成带有分隔符的 CVS 文件,因为 AWS 不提供文件级访问。以上是关于1214:使用 COPY 命令将数据从 csv 导入 Redshift 时 CSV 的报价格式无效的主要内容,如果未能解决你的问题,请参考以下文章
由于我的 csv 文件中的某些数据中存在“\”,Redshift Copy 命令失败
在 Spring Boot 中使用 Copy 命令从 Postgres 导出数据