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 上的许多存储桶加载数据的主要内容,如果未能解决你的问题,请参考以下文章
如何从一个账户访问 s3 存储桶中的数据以在另一个账户中使用 redshift 处理数据?