使用非标准分隔符从s3复制到redshift

时间:2015-01-29 15:29:07

标签: amazon-s3 copy amazon-redshift

这给了我一些严重的头痛。我在redshift中有一个简单的表

create table data.texttest(
    col1 int null,
    col2 int null,
    col3 varchar(256) null,
    col4 int null,
    col5 int null
);

以下说是一个gzip压缩文件,其中行分隔符为LF(无CR)

col-1þcol-2þcol-3þcol-4þcol5
1268437þ1268437þSome Textþ0þ
1268437þ1268443þSome Textþ0þ
1268437þ1881096þSome Textþ0þ
1268437þ1881109þSome Textþ0þ
1268437þ1881114þSome Textþ0þ
1268437þ1881115þSome Textþ0þ
1268437þ1881129þSome Textþ0þ
1268437þ2807685þSome Textþ0þ
2931841þ2931841þSome Textþ0þ
1268437þ3368478þSome Textþ0þ
1268437þ4339135þSome Textþ0þ
1268437þ4357980þSome Textþ0þ
1268437þ4483058þSome Textþ0þ

加载很简单......

copy data.texttest (col1,col2,col3,col4,col5) from 's3://<bucket>/<file_name>.log.gz' with credentials 'aws_access_key_id=<>;aws_secret_access_key=<>' delimiter '\376' gzip ignoreheader 1;`

但是唉......不。我一直在col1上得到以下红色错误

  

1214 |未找到分隔符

当我用逗号手动替换þ(小刺,'\ 376')时,redshift很高兴。显然我在实际过程中无法改变它。我在这里错过了什么吗?

感谢任何帮助。

2 个答案:

答案 0 :(得分:0)

我们遇到了同样的问题,我们解决了用tab标签替换þ字符。

如果您使用linux加载数据,可以使用以下命令:

sed -i's /þ/ \ t / g'/your/file/path/file_name.extension

选项-i允许命令覆盖原始文件。要保持原始文件的使用:

sed -e's /þ/ \ t / g'/your/file/path/file_name.extension> newfile_name.extension

答案 1 :(得分:0)

分隔符必须是ASCII(COPY documentation

  

单个ASCII字符,用于分隔输入中的字段   文件

因此需要进行一些预处理。 sed答案是一个很好的答案,这也可以与SSH摄取(而不是复制)相结合,这样你就可以在'途中'修改流中的字符,而不是先重写数据。 / p>

第二种方法,有点像是通过COPY加载到具有单个文本列的临时表中,然后使用SPLIT_PART和{{{{3}}的组合将其处理到目标表中1}}或create target as select split_part(...样式查询。 Split_part不要求其分隔符为ASCII,至少不是根据文档。