由于我的 csv 文件中的某些数据中存在“\”,Redshift Copy 命令失败
Posted
技术标签:
【中文标题】由于我的 csv 文件中的某些数据中存在“\\”,Redshift Copy 命令失败【英文标题】:Redshift Copy command fails due '\' present in some of the data in my csv file由于我的 csv 文件中的某些数据中存在“\”,Redshift Copy 命令失败 【发布时间】:2020-11-19 04:59:14 【问题描述】:我正在尝试将 csv 文件从 S3 复制到 Redshift 表。我的 csv 文件中几乎没有列在数据中包含“\”。以下是样本数据:
columnA|columnB|columnC|columnD|columnE
-------+-------+-------+-------+-------
abc | 12\ | xyz | test | hello
lmn | 123 | pqr\ | test | bye
jkl | 124 | deg | test | hi
我正在使用下面的命令在 Redhisft 中复制,但它失败了:
COPY redshif_schema.redshift_table_name from 's3://bucket/folder/inputfile.csv' access_key_id '<access_id>' secret_access_key '<secret_key>' fillrecord escape delimiter as '|' IGNOREHEADER as 1 ACCEPTANYDATE emptyasnull blanksasnull maxerror 0 ;
当我在 stl_load_errors 表中检查 raw_line 时,我看到下面(2 个反斜杠):
abc | 12\\ | xyz | test | hello
有人可以帮忙吗?
【问题讨论】:
【参考方案1】:您的COPY
命令中有ESCAPE
参数,AWS COPY examples 提及:
以下示例显示如何加载与分隔符匹配的字符(在本例中为竖线字符)。在输入文件中,确保您要加载的所有管道字符 (|) 都使用反斜杠字符 () 进行转义。然后使用 ESCAPE 参数加载文件。
这导致12\|xyz
在您转义管道时被解释为一列。我想你可以在没有 ESCAPE 的情况下运行它 - 但如果你真的在列中有 |
,它就会失败。
【讨论】:
是的,你是对的。如果我从命令中删除 ESCAPE,它也会失败。我想以某种方式让命令知道将“\”视为列值。我该怎么做? 如果我删除 ESCAPE,它会尝试在 columnC 中添加记录号 2 作为 pqr\test。它将尝试在 columnD 中添加记录号 2 作为再见。因此,我会有不一致的数据 等等,pqr\test
是 C 列,但第 1 行的 12\|xyz
可以吗?或者这也是在一列中?
同样的问题。它对记录 1 也做类似的事情,其中 columnB 的值被取为 12\xyz
问题的编辑现在显示不同的数据,现在您的示例输入也有两个反斜杠,这是正确的吗?以上是关于由于我的 csv 文件中的某些数据中存在“\”,Redshift Copy 命令失败的主要内容,如果未能解决你的问题,请参考以下文章
如果检测字符串中的CSV列使用python在日志文件中存在吗?