运行COPY命令将gzip-ed数据加载到S3中的Redshift

时间:2015-01-12 11:50:01

标签: amazon-web-services amazon-s3 amazon-redshift

当我运行我的复制命令将所有文件从S3文件夹复制到Redshift表时,它失败并带有 "ERROR: gzip: unexpected end of stream. Unknown zlib error code. zlib error code: -1"

copy table_name 
    (column_list)
from 's3://bucket_name/folder_name/'
     credentials 'aws_access_key_id=xxxxxx;aws_secret_access_key=xxxxxxxxx'
     delimiter '|' GZIP

但是,当我为文件夹中的每个文件指定文件前缀时,它会成功:

copy table_name 
    (column_list)
from 's3://bucket_name/folder_name/file_prefix'
     credentials 'aws_access_key_id=xxxxxx;aws_secret_access_key=xxxxxxxxx'
     delimiter '|' GZIP

这些文件是GZIP编辑的。

在AWS文档中没有明确指出,如果你只是指定了folder_name,那么copy命令可以加载该文件夹的全部内容,但是我确实收到了错误。

有没有人遇到过类似的问题?这种操作需要文件前缀吗?

3 个答案:

答案 0 :(得分:5)

您的一个gzip压缩文件格式不正确。 GZip包含文件末尾的压缩“字典”,没有它就无法扩展。

如果文件没有完全写入,例如,磁盘空间不足,那么当您尝试将其加载到Redshift中时,会看到错误。

从经验谈起......; - )

答案 1 :(得分:2)

我遇到了同样的问题,在我的情况下,gzip文件是正确的,因为当使用具有确切文件名的复制命令时,它工作正常。

问题主要是因为应用程序" S3浏览器"。使用它创建目录时,它会在其中创建一些额外的隐藏文件。当copy命令尝试读取目录中的文件时,它会读取那些隐藏的无效gzip文件并抛出错误。

答案 2 :(得分:0)

对我来说,问题是清单文件中写入了原始的卸载gz文件路径。 您可以删除清单文件,而COPY命令将从您在命令本身中指定的路径中成功读取gzip文件。