2017-03-02 58 views
1

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

例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上创建临时文件?

回答

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必须指定文件桶名称和完整对象路径,而不只是一个字首。

使用清单文件的目的是要知道究竟哪些文件已加载到亚马逊的红移。加载定期可用的文件时,此功能特别有用。例如,如果文件每5分钟出现一次,并且运行COPY命令以从给定前缀加载数据,则不清楚哪些文件已被加载。这导致潜在的双重加载文件。

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

无法使用清单文件加载来自不同桶/路径的内容。