将带逗号的双引号作为分隔符从 S3 导入 Amazon Redshift

Posted

技术标签:

【中文标题】将带逗号的双引号作为分隔符从 S3 导入 Amazon Redshift【英文标题】:Import quoted doubles with comma as separator into Amazon Redshift from S3 【发布时间】:2017-05-11 18:30:32 【问题描述】:

我正在尝试将 CSV 文件从存储在 S3 上的 CSV 文件导入 Redshift 数据库。 CSV 文件被完全引用(因此即使是完全整数列也使用 " 引用)。

该表还包含双精度数,它们也被引用并使用荷兰语分隔整数和小数的方式(1,5 是一个半)。

所以基本上,我的文件如下所示:

"int_key", "double_value"
"1", "2,50"
"2", "3,50"

如果我“直接”导入它,我会收到错误:

Invalid digit, Value '"', Pos 0, Type: Integer

然后,我将removequotes 添加到我的查询中,以正确处理我的整数整数。但是,现在我的双列不理解逗号:

Invalid digit, Value ',', Pos 1, Type: Double 

有什么方法可以告诉 Redshift 使用逗号进行双打吗?

文件太大,无法通过正则表达式并用句点替换逗号。

【问题讨论】:

类似:importing data with commas in numeric fields into redshift 您的样本是否有意使用逗号和空格分隔?这也会引起问题。或者,您的数据是否只有逗号作为分隔符? 只有逗号。我猜我输入空格是一种习惯的力量 【参考方案1】:

您的示例数据包含逗号和空格的分隔符:

"int_key", "double_value"
"1", "2,50"
"2", "3,50"

仅此一项似乎就阻止了它加载到 Amazon Redshift。

但是,如果你只有逗号分隔符,也可以,例如:

"int_key","double_value"
"1","2,50"
"2","3,50"

您可以将第二个字段加载为字符串,然后使用REPLACE() 函数对其进行转换。

CREATE TABLE foo AS (i int, s string, f float);
COPY INTO foo FROM 's3://...' DELIMITER ',' IGNOREHEADER 1 REMOVEQUOTES;
UPDATE foo SET f = REPLACE(s, ',' , '.')::float;

运行 UPDATE 命令需要一些时间,但这比修改输入文件要容易。

【讨论】:

以上是关于将带逗号的双引号作为分隔符从 S3 导入 Amazon Redshift的主要内容,如果未能解决你的问题,请参考以下文章

如何在使用 EMR/Hive 将数据从 S3 导入 DynamoDB 时处理包含在引号 (CSV) 中的字段

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

CSV文件的双引号怎么去掉。用记事本打开有双引号,EXCEL打开又没有了,怎么样去掉这个双引号,这是个啥

导入包含引号中的逗号的字段的 CSV 文件?

hive导入csv文件,字段中双引号内有逗号

CSV文件格式介绍