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 导出数据

错误:加载到表中 - COPY 命令中的数据无效

Redshift 中的 COPY CSV 命令是不是按标题中定义的顺序加载?

psql备份csv文件

使用 COPY FROM 从 CSV 导入数据时转换列