由于我的 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在日志文件中存在吗?

如何在众多 CSV 中测试某些列名的存在

从 R 中的大型 .CSV 导入和提取随机样本

如何有条件地删除 R 中 write.csv 中的双引号

将 csv 文件导入 python 后,为啥我的某些数据列在我的数据框中无法识别

加快我的数据加载操作