【问题标题】:copy from s3 to redshift with a non standard delimiter使用非标准分隔符从 s3 复制到 redshift
【发布时间】:2015-01-29 15:29:07
【问题描述】:

这让我有些头疼。我在 redshift 中有一个简单的表格

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

下面说的是压缩文件,其中行分隔符是 LF(no 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 很高兴。显然我不能在实际过程中改变它。我在这里错过了什么吗?

感谢任何帮助。

【问题讨论】:

    标签: amazon-s3 copy amazon-redshift


    【解决方案1】:

    分隔符必须是 ASCII (COPY documentation)

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

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

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

    【讨论】:

    • ...但他们确实说Non-printing ASCII characters are supported. ASCII characters can also be represented in octal, using the format '\ddd', where 'd' is an octal digit (0-7).
    • ssh 集成是一种选择,但同样意味着逐行读取文件,就像我提到的那样,由于第二种方法的大小/行数,这不是一个可行的选择,但就像你一样说它有点过头了,会使管道更加复杂
    • 是的,非打印 ASCII 字符 允许的,但您的分隔符不是 ASCII、非打印或其他。我会使用 SPLIT_PART 方法,我认为它不会太复杂,这意味着您可以从 S3 加载而无需先修改文件。
    【解决方案2】:

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

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

    【讨论】:

    • 但这意味着在 aws 术语中 Download the file form s3 -> Unzip the file -> run **sed** -> gzip it-> upload the file back to s3-> load to redshift 现在不是一个非常有效的管道它?但就像你说的那样,这似乎是一个限制......该死的你:D
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-08-10
    • 1970-01-01
    • 1970-01-01
    • 2013-05-31
    • 2015-09-01
    • 2015-12-20
    • 1970-01-01
    相关资源
    最近更新 更多