使用多个清单文件从 S3 加载到 Redshift?

Posted

技术标签:

【中文标题】使用多个清单文件从 S3 加载到 Redshift?【英文标题】:Using multiple manifest files to load to Redshift from S3? 【发布时间】:2017-08-20 18:49:48 【问题描述】:

我有一个包含大约 460,000 个条目(所有 S3 文件)的大型清单文件,我希望将其加载到 Redshift。由于我无法控制的问题,其中一些(可能是十几个或更多)条目包含错误的 JSON,如果我一次传入整个清单,这将导致 COPY 命令失败。使用带有键前缀的 COPY 也会以同样的方式失败。

为了解决这个问题,我编写了一个 Python 脚本,它一次通过一个 URL 遍历清单文件,并使用 psycopg2 为每个 URL 发出一个 COPY 命令。该脚本还将捕获并记录任何错误,以确保脚本即使遇到错误文件也能运行,并允许我们定位和修复错误文件。

该脚本已经在一个备用 EC2 实例上运行了一个多星期,仅完成了大约 75%。我想降低运行时间,因为这个脚本会被再次使用。

我对 Redshift 的理解是 COPY 命令是并行执行的,因此我有了一个想法 - 将清单文件分成更小的块,然后运行每个块的脚本,以减少加载所有文件所需的时间文件?

【问题讨论】:

【参考方案1】:

COPY 命令可以非常快速有效地并行加载多个文件。因此,当您为 python 文件中的每个文件运行一个 COPY 命令时,这将花费大量时间,因为您没有利用并行加载。

所以也许您可以编写一个脚本来查找清单中的错误 JSON 并将它们踢出并使用新的干净清单运行单个 COPY?

或者像你建议的那样,我建议将清单文件分成小块,以便 COPY 可以一次运行多个文件。 (不是每个文件都有一个 COPY 命令)

【讨论】:

以上是关于使用多个清单文件从 S3 加载到 Redshift?的主要内容,如果未能解决你的问题,请参考以下文章

使用清单从多个 s3 文件夹加载红移表

仅将新文件从 S3 加载到 Redshift 的简单方法?

使用 for 循环从 s3 复制 Redshift

用于将数据从AWS S3加载到Redshift的Python脚本

从 s3 到 Redshift 的数据复制:清单与我需要下载的文件位于不同的存储桶中

使用复制命令和清单文件将 parquet 格式文件加载到 Amazon Redshift 时出错