AWS Redshift:在S3上加载来自许多存储桶的数据

时间:2017-03-02 13:43:08

标签: amazon-web-services amazon-s3 amazon-redshift

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

示例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电话中完成。我已经看到清单文件允许指定几个不同的文件(包括来自不同的桶)。但是:

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

1 个答案:

答案 0 :(得分:2)

您可以使用清单文件指定不同的存储分区,路径和文件。

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命令。

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