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

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

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

Amazon Redshift がサポートする UNLOAD コマンドでは、任意の select ステートメントを使用できます (ただし、外側の select で LIMIT 句を使用するものを除きます)。例えば、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 は、クラスター内のスライスの数に応じて、データを複数のファイルに同時に書き込みます。1 つのファイルにデータを書き込むには、PARALLEL OFF を指定します。UNLOAD はデータを順次に書き込みます。データは ORDER BY 句 (使用されている場合) に従ってソートされます。データファイルの最大サイズは 6.2 GB です。データサイズが最大値よりも大きい場合、UNLOAD は追加のファイルをそれぞれ 6.2 GB を上限として作成します。

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

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

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

VENUE のデータサイズの合計が 5 GB とすると、次に例では、VENUE のコンテンツを各 100 MB サイズの 50 ファイルに書き込みます。

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

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

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

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

{ "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' で終わるファイルも表示されます。次に例を示します。

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 リストのオペレーションを呼び出します。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 ではファイルが 1 つのスライスにつき複数の部分に分割されることがあります。次に例を示します。

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;