将带逗号的双引号作为分隔符从 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) 中的字段