我正在尝试从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电话中完成。我已经看到清单文件允许指定几个不同的文件(包括来自不同的桶)。但是:
答案 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命令。
如果不使用清单文件,则无法从不同的存储桶/路径加载内容。