將資料卸載到 Amazon S3 - Amazon Redshift

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

將資料卸載到 Amazon S3

Amazon Redshift 會將 select 陳述式的結果分散在一組檔案中,每個節點分割中一或多個檔案,來簡化資料的平行重新載入。或者,您可以指定 UNLOAD,其應會透過新增 PARALLEL OFF 選項,來依順序將結果寫入至一或多個檔案。您可以透過指定 MAXFILESIZE 參數,來限制 Amazon S3 中的檔案大小。UNLOAD 會自動使用 Amazon S3 伺服器端加密 (SSE-S3) 加密資料檔案。

您可以在 Amazon Redshift 支援的 UNLOAD 命令中使用任何 select 陳述式,除了在外部 select 中使用 LIMIT 子句的 select 以外。例如,您可以使用其中包含特定欄位的 select 陳述式,或使用 where 子句來聯結多個表格。如果您的查詢包含引號 (例如用來括住常值),您需要在查詢常值中逸出它們 (\')。如需詳細資訊,請參閱 SELECT 命令參考。如需使用 LIMIT 子句的詳細資訊,請參閱 使用須知 以了解 UNLOAD 命令。

例如,下列 UNLOAD 命令可將 VENUE 表格的內容傳送至 Amazon S3 儲存貯體 s3://mybucket/tickit/unload/

unload ('select * from venue') to 's3://mybucket/tickit/unload/venue_' iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole';

先前範例建立的檔名包含字首 'venue_'。

venue_0000_part_00 venue_0001_part_00 venue_0002_part_00 venue_0003_part_00

依預設,UNLOAD 會根據叢集中的分割數,將資料平行寫入多個檔案。若要將資料寫入單一檔案,請指定 PARALLEL OFF。UNLOAD 會按順序寫入資料,且如果有使用 ORDER BY 字句,則會根據該子句進行絕對排列。資料檔案大小上限為 6.2 GB。如果資料大小大於上限 (每個高達 6.2 GB),UNLOAD 會額外建立檔案。

以下範例指會將內容 VENUE 寫入單一檔案。僅需要一個檔案,因為檔案大小少於 6.2 GB。

unload ('select * from venue') to 's3://mybucket/tickit/unload/venue_' iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole' parallel off;
注意

UNLOAD 命令是設計為使用平行處理。我們建議在多數的情況將 PARALLEL 保持為啟用,特別是在使用 COPY 命令將檔案是用來載入表格時。

假設 VENUE 的資料大小總計為 5 GB,下列範例會將 VENUE 的內容寫入至 50 個檔案,每個大小為 100 MB。

unload ('select * from venue') to 's3://mybucket/tickit/unload/venue_' iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole' parallel off maxfilesize 100 mb;

如果您在 Amazon S3 路徑中包含字首,UNLOAD 將使用該字首做為檔名。

unload ('select * from venue') to 's3://mybucket/tickit/unload/venue_' iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole';

您可以在 UNLOAD 命令指定 MANIFEST 選項,以建立列出卸載檔案的資訊清單檔案。清單檔案是 JSON 格式的文字檔,其中明確列出寫入 Amazon S3 的每個檔案的 URL。

下列範例包含資訊清單選項。

unload ('select * from venue') to 's3://mybucket/tickit/venue_' iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole' manifest;

下列範例顯示四個卸載檔案的資訊清單。

{ "entries": [ {"url":"s3://mybucket/tickit/venue_0000_part_00"}, {"url":"s3://mybucket/tickit/venue_0001_part_00"}, {"url":"s3://mybucket/tickit/venue_0002_part_00"}, {"url":"s3://mybucket/tickit/venue_0003_part_00"} ] }

資訊清單檔案可用來載入相同的檔案,方法是使用 COPY 搭配 MANIFEST 選項。如需更多詳細資訊,請參閱 使用資訊清單指定資料檔案

在您完成 UNLOAD 操作後,透過導覽至 UNLOAD 將檔案寫入其中的 Amazon S3 儲存貯體,來確認檔案是否正確卸載。您將會在每個分割看到一或多個含編號的檔案,從編號零開始。如果指定 MANIFEST 選項,則您將會看見結尾為 manifest 的檔案。例如:

mybucket/tickit/venue_0000_part_00 mybucket/tickit/venue_0001_part_00 mybucket/tickit/venue_0002_part_00 mybucket/tickit/venue_0003_part_00 mybucket/tickit/venue_manifest

您可以在 UNLOAD 完成後呼叫 Amazon S3 清單操作,以程式設計方式取得寫入 Amazon S3 的檔案清單。您也可以查詢 STL_UNLOAD_LOG。

下列查詢會傳回已由 UNLOAD 建立之檔案的路徑名稱。PG_LAST_QUERY_ID 函數會傳回最近的查詢。

select query, substring(path,0,40) as path from stl_unload_log where query=2320 order by path; query | path -------+-------------------------------------- 2320 | s3://my-bucket/venue0000_part_00 2320 | s3://my-bucket/venue0001_part_00 2320 | s3://my-bucket/venue0002_part_00 2320 | s3://my-bucket/venue0003_part_00 (4 rows)

如果資料量很大,Amazon Redshift 可能會根據分割將檔案分為多個部分。例如:

venue_0000_part_00 venue_0000_part_01 venue_0000_part_02 venue_0001_part_00 venue_0001_part_01 venue_0001_part_02 ...

下列 UNLOAD 命令包含在 select 陳述式中以引號括住的字串,因此引號會被逸出 (=\'OH\' ')。

unload ('select venuename, venuecity from venue where venuestate=\'OH\' ') to 's3://mybucket/tickit/venue/ ' iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole';

根據預設,UNLOAD 會失敗,而不會覆寫目的地儲存貯體中的現有檔案。為覆寫現有檔案 (包括資訊清單檔案),指定 ALLOWOVERWRITE 選項。

unload ('select * from venue') to 's3://mybucket/venue_pipe_' iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole' manifest allowoverwrite;