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

Running a COPY command to load gzip-ed data to Redshift in S3

当我 运行 我的复制命令将所有文件从 S3 文件夹复制到 Redshift table 时失败 "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 复制命令加载该文件夹的全部内容就可以了,但是我确实遇到了错误。

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

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

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

经验之谈……;-)

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

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

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