AWS Redshift:从 S3 上的许多存储桶加载数据

Posted

技术标签:

【中文标题】AWS Redshift:从 S3 上的许多存储桶加载数据【英文标题】:AWS Redshift: Load data from many buckets on S3 【发布时间】:2017-03-02 13:43:07 【问题描述】:

我正在尝试将数据从 S3 上的两个不同存储桶加载到 Redshift 表。每个bucket中都有名称中带有日期的目录,每个目录包含很多文件,但没有manifest。

示例 S3 结构:

# Bucket 1
s3://bucket1/20170201/part-01
s3://bucket1/20170201/part-02

s3://bucket1/20170202/part-01

s3://bucket1/20170203/part-00
s3://bucket1/20170203/part-01

# Bucket 2
s3://bucket2/20170201/part-00

s3://bucket2/20170202/part-00
s3://bucket2/20170202/part-01

s3://bucket2/20170203/part-00

假设应加载 20170201 和 20170202 两个存储桶中的数据。其中一个解决方案可以运行 4 次 COPY 命令 - 每个存储桶日期对一个。但我很好奇它是否可以在单个 COPY 调用中完成。我已经看到清单文件允许指定几个不同的文件(包括来自不同存储桶的文件)。然而:

    是否可以选择在清单中使用前缀而不是完整路径, 我可以在 SQL 中以某种方式使用清单,将其作为字符串而不是文件位置传递 - 我想避免在 S3 上创建临时文件吗?

【问题讨论】:

【参考方案1】:

您可以使用清单文件来指定不同的存储桶、路径和文件。

Using a Manifest to Specify Data Files 文档显示了一个示例:


  "entries": [
    "url":"s3://mybucket-alpha/2013-10-04-custdata", "mandatory":true,
    "url":"s3://mybucket-alpha/2013-10-05-custdata", "mandatory":true,
    "url":"s3://mybucket-beta/2013-10-04-custdata", "mandatory":true,
    "url":"s3://mybucket-beta/2013-10-05-custdata", "mandatory":true
  ]

文档还说:

清单中的 URL 必须指定文件的存储桶名称和完整的对象路径,而不仅仅是前缀。

使用清单文件的目的是了解哪些文件已加载到 Amazon Redshift。这在加载定期可用的文件时特别有用。例如,如果文件每 5 分钟出现一次,并且运行 COPY 命令从给定前缀加载数据,则不清楚哪些文件已经加载。这会导致潜在的双重加载文件。

补救方法是使用清单文件,明确指定要加载的文件。这显然需要一些代码来查找文件,创建清单文件,然后触发 COPY 命令。

如果不使用清单文件,则无法从不同的存储桶/路径加载内容。

【讨论】:

我可以在 JSON 对象中有两个 URL 和两个必填字段吗?例如: "entries": [ "url":"s3://mybucket-alpha/2013-10-04-custdata", "mandatory":true,"URL":"s3://mybucket-alpha /2013-10-04-mydata","mandatory":false, "url":"s3://mybucket-alpha/2013-10-05-custdata", "mandatory":true, "url ":"s3://mybucket-beta/2013-10-04-custdata", "强制":true, "url":"s3://mybucket-beta/2013-10-05-custdata", “强制”:true] @user2723803 请创建一个新问题,而不是通过对旧问题的评论来提问。

以上是关于AWS Redshift:从 S3 上的许多存储桶加载数据的主要内容,如果未能解决你的问题,请参考以下文章

递归地将数据从 redshift 卸载到 S3 存储桶

如何从一个账户访问 s3 存储桶中的数据以在另一个账户中使用 redshift 处理数据?

如何在写入 Redshift DW 之前从 S3 存储桶转换数据?

尝试加载 Redshift 样本,从 S3 复制时拒绝访问

AWS Glue 数据从 S3 迁移到 Redshift

AWS DMS Redshift 作为目标