在 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 命令会引发错误
如果我使用 COPY 命令将数据从 S3 加载到 Redshift,它会遵循我的 dist 样式和键吗?