Amazon s3 使用非标准分隔符从s3复制到红移

Amazon s3 使用非标准分隔符从s3复制到红移,amazon-s3,copy,amazon-redshift,Amazon S3,Copy,Amazon Redshift,这使我头痛得厉害。我有一张红移的简单桌子 create table data.texttest( col1 int null, col2 int null, col3 varchar(256) null, col4 int null, col5 int null ); 下面是一个gzip文件,其中行分隔符是LF(无CR) 加载很简单 copy data.texttest (col1,col2,col3,col4,col5) from 's3://<

这使我头痛得厉害。我有一张红移的简单桌子

create table data.texttest(
    col1 int null,
    col2 int null,
    col3 varchar(256) null,
    col4 int null,
    col5 int null
);
下面是一个gzip文件,其中行分隔符是LF(无CR)

加载很简单

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;`
使用凭据“aws\u access\u key\u id=”从“s3://.log.gz”复制data.texttest(col1、col2、col3、col4、col5);aws_secret_access_key='delimiter'\376'gzip ignoreheader 1`
但是,唉。。。不,我一直在col1上发现以下红色错误

1214 |未找到分隔符

当我手动将þ(小刺,“\376”)替换为逗号时,redshift很高兴。显然,在实际过程中,我无法改变它。我是不是错过了什么


感谢您的帮助

我们遇到了同样的问题,我们解决了它,将þ字符替换为制表符

如果使用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

分隔符必须是ASCII()

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

因此,需要进行一些预处理。
sed
答案很好,它还可以与SSH摄取(而不是复制)结合使用,这样您就可以“中途”修改流中的字符,而不是先重新写入数据


第二种方法有点麻烦,就是通过COPY将一个文本列加载到一个staging表中,然后使用和的组合
create target as select split\u part(…
insert in…select split\u part)将其处理到目标表中(…
style query.Split\u part不要求其分隔符为ASCII,至少根据文档是这样的。

但在aws术语中,这意味着从s3下载文件->
解压文件
运行**
->gzip it->
将文件上传回s3
加载到redshift
而不是非常高效的管线,是吗?但就像你说的,这似乎是一个限制。该死的aws:D…但是他们说支持
非打印ASCII字符。ASCII字符也可以用八进制表示,使用格式“\ddd”,其中“D”是八进制数字(0-7).
ssh集成是一个选项,但这同样意味着逐行读取文件,正如我提到的,这不是一个可行的选项,因为第二种方法的行数/大小是有潜力的,但正如您所说的,它有点过头了,会使管道更加复杂,允许使用非打印ASCII字符,但是分隔符不是ASCII、非打印或其他形式。我会使用分割部分的方法,我不认为它太复杂,这意味着您可以从S3加载,而不必首先损坏文件。
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;`