メニュー
Amazon Redshift
データベース開発者ガイド (API Version 2012-12-01)

データを Amazon S3 にアンロードする

Amazon Redshift には、select ステートメントの結果を分割して一連のファイルに出力する機能があります。ノードスライスごとに 1 つ以上のファイルが作成されるので、データの並列再ロードが容易になります。または、PARALLEL OFF オプションを追加することで、UNLOAD が 1 つ以上のファイルに結果を順次に書き込めるように指定できます。UNLOAD は、Amazon S3 サーバー側暗号化 (SSE-S3) 機能を使用してデータを自動的に暗号化します。

Amazon Redshift がサポートする UNLOAD コマンドでは、任意の select ステートメントを使用できます (ただし、外側の select で LIMIT 句を使用するものを除きます)。例えば、select ステートメントの中で特定の列を選択することや、where 句を使用して複数のテーブルを結合することができます。クエリの中に引用符がある (例えば、リテラル値を囲むため) 場合は、クエリテキスト内でエスケープする (\') 必要があります。詳細については、SELECT コマンドのリファレンスを参照してください。LIMIT 句の使用方法の詳細については、「使用に関する注意事項」で UNLOAD コマンドの使用に関する注意事項を参照してください。

たとえば、次に示す UNLOAD コマンドを実行すると、VENUE テーブルの内容が Amazon S3 バケット s3://mybucket/tickit/unload/ に送信されます。

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

Amazon S3 パス文字列の中にプレフィックスがある場合は、UNLOAD 実行時にそのプレフィックスがファイル名に使用されます。

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

前の例で作成されたファイル名には、'venue_' というプレフィックスが付いています。

Copy
venue_0000_part_00 venue_0001_part_00 venue_0002_part_00 venue_0003_part_00

デフォルトでは、UNLOAD は、クラスター内のスライスの数に応じて、データを複数のファイルに同時に書き込みます。1 つのファイルにデータを書き込むには、PARALLEL OFF を指定します。UNLOAD はデータを順次に書き込みます。データは ORDER BY 句 (使用されている場合) に従ってソートされます。データファイルの最大サイズは 6.2 GB です。データサイズが最大値よりも大きい場合、UNLOAD は追加のファイルをそれぞれ 6.2 GB を上限として作成します。

以下の例では、コンテンツ VENUE を 1 つのファイルに書き込んでいます。1 つのファイルのみが必要なのは、ファイルサイズが 6.2 GB より小さいためです。

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

注記

UNLOAD コマンドは、並列処理を使用するように設計されています。特別な理由がなく、特にファイルが COPY コマンドを使用してテーブルをロードするために使用される場合には、PARALLEL を有効にしたままにすることをお勧めします。

一時的セキュリティ認証情報を使い、データにアクセスするユーザーを制限できます。一時的セキュリティ認証情報はセキュリティを強化します。使用期限が短く、期限が切れた後は再利用できないためです。このような一時的セキュリティ認証情報を与えられたユーザーは、その認証情報の有効期限の間だけリソースにアクセスできます。詳細については、「一時的セキュリティ認証情報」を参照してください。一時的なアクセス認証情報を使用してデータをアンロードするには、次の構文を使用します。

Copy
unload ('select * from venue') to 's3://mybucket/tickit/venue_' access_key_id '<access-key-id>' secret_access_key '<secret-access-key' token '<temporary-token>';

重要

一時的セキュリティ認証情報は、COPY ステートメントの期間全体で有効にする必要があります。一時的セキュリティ認証情報の期限がロードプロセス中に切れた場合、COPY は失敗し、処理はロールバックされます。例えば、一時的セキュリティ認証情報の期限が 15 分後に切れるときに COPY に 1 時間かかる場合、COPY は完了前に失敗します。

UNLOAD コマンドで MANIFEST オプションを指定することで、アンロードファイルをリストするマニフェストファイルを作成できます。マニフェストは、Amazon S3 に書き込まれた各ファイルの URL を明示的にリストする、JSON 形式のテキストファイルです。

次の例では MANIFEST オプションが含めています。

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

次の例は、4 個のアンロードファイルについてのマニフェストを示します。

Copy
{ "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 バケットに移動します。スライスごとに 1 つ以上のファイルがあり、ファイルには 0 から始まる番号が付けられています。MANIFEST オプションを指定した場合、'manifest' で終わるファイルも表示されます。以下に例を示します。

Copy
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

Amazon S3 に出力されたファイルのリストをプログラムで取得するには、UNLOAD 完了後に Amazon S3 リスト操作を呼び出します。ただし、この呼び出しの早さによっては、リストが不完全になることがあります。Amazon S3 リスト操作は結果整合であるからです。完成した正式のリストをすぐに取得するには、STL_UNLOAD_LOG をクエリします。

次のクエリは、UNLOAD によって作成されたファイルのパス名を返します。PG_LAST_QUERY_ID() 関数は、最新のクエリを返します。

Copy
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 ではファイルが 1 つのスライスにつき複数の部分に分割されることがあります。(例:

Copy
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\' ')。

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

デフォルトでは、出力先のバケットにすでにファイルがある場合はファイルが上書きされるのではなく UNLOAD が異常終了します。マニフェストファイルを含めて既存のファイルを上書きするには、ALLOWOVERWRITE オプションを指定します。

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