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

Posted

技术标签:

【中文标题】在 S3 中运行 COPY 命令以将 gzip-ed 数据加载到 Redshift【英文标题】:Running a COPY command to load gzip-ed data to Redshift in S3 【发布时间】:2015-01-12 11:50:01 【问题描述】:

当我运行复制命令将所有文件从 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 文档中没有明确指定,如果您只指定文件夹名称,则复制命令可以加载该文件夹的全部内容,但是我确实收到了错误。

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

【问题讨论】:

存储桶 s3://bucket_name/folder_name/ 中是否还有其他文件(不是 gzip)? 不,该文件夹仅包含 gzip 文件 你可以试试 s3cmd ls s3://bucket_name/folder_name 吗?或使用 aws s3 cli 致未来的读者:OP 在使用前缀时没有出错的原因是跳过了错误文件。这是使用前缀的“功能”,无论它是否匹配多个文件的单个文件。我不喜欢它,因为它默默地隐藏了失败。使用清单加载批量文件更加“稳健”。 【参考方案1】:

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

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

经验之谈……;-)

【讨论】:

【参考方案2】:

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

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

【讨论】:

【参考方案3】:

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

【讨论】:

以上是关于在 S3 中运行 COPY 命令以将 gzip-ed 数据加载到 Redshift的主要内容,如果未能解决你的问题,请参考以下文章

如果 S3 前缀不存在,Redshift COPY 命令会引发错误

Redshift COPY 命令无法从 S3 加载数据

如果我使用 COPY 命令将数据从 S3 加载到 Redshift,它会遵循我的 dist 样式和键吗?

从 lambda 中使用 redshift COPY 命令的权限

来自 S3 的 AWS Redshift COPY csv

来自空 S3 分区的 Redshift COPY