2017-03-02 92 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命令。

無法使用清單文件加載來自不同桶/路徑的內容。