

 Amazon Redshift は、パッチ 198 以降、新しい Python UDF の作成をサポートしなくなります。既存の Python UDF は、2026 年 6 月 30 日まで引き続き機能します。詳細については、[ブログ記事](https://aws.amazon.com/blogs/big-data/amazon-redshift-python-user-defined-functions-will-reach-end-of-support-after-june-30-2026/)を参照してください。

# Amazon Redshift でのデータのアンロード
<a name="c_unloading_data"></a>

データベーステーブルからデータをアンロードして Amazon S3 バケットの一連のファイルに出力するには、[UNLOAD](r_UNLOAD.md) コマンドを SELECT ステートメントとともに使用します。テキストデータは、ロード時に使用されたデータ形式にかかわらず、区切り文字付き形式と固定幅形式のどちらでもアンロードできます。圧縮された GZIP ファイルを作成するかどうかを指定することもできます。

Amazon S3 バケットに対するユーザーのアクセスを制限するには、一時的なセキュリティ認証情報を使用します。

**Topics**
+ [データを Amazon S3 にアンロードする](t_Unloading_tables.md)
+ [暗号化されたデータファイルをアンロードする](t_unloading_encrypted_files.md)
+ [区切り文字付きまたは固定幅形式でデータをアンロードする](t_unloading_fixed_width_data.md)
+ [アンロードしたデータを再ロードする](t_Reloading_unload_files.md)

# データを Amazon S3 にアンロードする
<a name="t_Unloading_tables"></a>

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

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

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

```
unload ('select * from venue')   
to 's3://amzn-s3-demo-bucket/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://amzn-s3-demo-bucket/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://amzn-s3-demo-bucket/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://amzn-s3-demo-bucket/tickit/unload/venue_' 
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole';
```

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

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

```
unload ('select * from venue')
to 's3://amzn-s3-demo-bucket/tickit/venue_' 
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
manifest;
```

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

```
{
  "entries": [
    {"url":"s3://amzn-s3-demo-bucket/tickit/venue_0000_part_00"},
    {"url":"s3://amzn-s3-demo-bucket/tickit/venue_0001_part_00"},
    {"url":"s3://amzn-s3-demo-bucket/tickit/venue_0002_part_00"},
    {"url":"s3://amzn-s3-demo-bucket/tickit/venue_0003_part_00"}
  ]
}
```

COPY コマンドで MANIFEST オプションを使用することで、マニフェストファイルを使用して同じファイルをロードできます。詳細については、「[マニフェストを使用し、データファイルを指定する](loading-data-files-using-manifest.md)」を参照してください。

UNLOAD オペレーションが完了したら、データが正しくアンロードされたことを確認します。確認するには、UNLOAD でファイルを出力した Amazon S3 バケットに移動します。スライスごとに 1 つ以上のファイルがあり、ファイルには 0 から始まる番号が付けられています。MANIFEST オプションを指定した場合、'`manifest`' で終わるファイルも表示されます。次に例を示します。

```
amzn-s3-demo-bucket/tickit/venue_0000_part_00 
amzn-s3-demo-bucket/tickit/venue_0001_part_00 
amzn-s3-demo-bucket/tickit/venue_0002_part_00 
amzn-s3-demo-bucket/tickit/venue_0003_part_00
amzn-s3-demo-bucket/tickit/venue_manifest
```

Amazon S3 に書き込まれたファイルのリストをプログラムで取得するには、UNLOAD 完了後に Amazon S3 リストのオペレーションを呼び出します。STL\$1UNLOAD\$1LOG をクエリすることもできます。

次のクエリは、UNLOAD によって作成されたファイルのパス名を返します。[PG\$1LAST\$1QUERY\$1ID](PG_LAST_QUERY_ID.md) 関数は、最新のクエリを返します。

```
select query, substring(path,0,40) as path
from stl_unload_log
where query=2320
order by path;

query |             path
-------+--------------------------------------
  2320 | s3://amzn-s3-demo-bucket/venue0000_part_00
  2320 | s3://amzn-s3-demo-bucket/venue0001_part_00
  2320 | s3://amzn-s3-demo-bucket/venue0002_part_00
  2320 | s3://amzn-s3-demo-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://amzn-s3-demo-bucket/tickit/venue/ ' 
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole';
```

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

```
unload ('select * from venue') 
to 's3://amzn-s3-demo-bucket/venue_pipe_' 
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
manifest 
allowoverwrite;
```

# 暗号化されたデータファイルをアンロードする
<a name="t_unloading_encrypted_files"></a>

UNLOAD は、AWS が管理する暗号化キー (SSE-S3) を使用した Amazon S3 のサーバー側暗号化により、ファイルを自動的に作成します。AWS Key Management Service キーを使用したサーバー側の暗号化 (SSE-KMS)、またはカスタマーマネージド型キーを使用したクライアント側の暗号化を指定することもできます。UNLOAD では、お客様が用意したキーによる Amazon S3 サーバー側の暗号化はサポートされません。詳細については、「[サーバー側の暗号化を使用したデータの保護](https://docs.aws.amazon.com/AmazonS3/latest/userguide/serv-side-encryption.html)」を参照してください。

AWS KMS キーを使用したサーバー側の暗号化によって Amazon S3 にアンロードするには、次の例に示すように KMS\$1KEY\$1ID パラメータを使用してキー ID を指定します。

```
unload ('select venuename, venuecity from venue')
to 's3://amzn-s3-demo-bucket/encrypted/venue_' 
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
KMS_KEY_ID '1234abcd-12ab-34cd-56ef-1234567890ab'
encrypted;
```

独自の暗号化キーを指定する場合は、ENCRYPTED オプションを指定した UNLOAD コマンドを使用することにより、Amazon S3 でクライアント側の暗号化データファイルを作成できます。UNLOAD で使用されるエンベロープ暗号化プロセスは、Amazon S3 のクライアント側暗号化で使用されているものと同じです。この暗号化されたファイルをロードするには、COPY コマンドとともに ENCRYPTED オプションを使用します。

このプロセスの動作は次のようになります。

1. ユーザーは、base64 で暗号化した 256 ビット AES キーを作成し、これをプライベート暗号化キー (*ルート対称キー*) として使用します。

1. 作成したルート対称キーと ENCRYPTED オプションを指定しながら、UNLOAD コマンドを実行します。

1. UNLOAD により、1 回限り使用の対称キー (*エンベロープ対称キー*と呼ばれます) と初期化ベクター (IV) が生成され、これが UNLOAD でのデータの暗号化に使用されます。

1. 作成したルート対称キーを使用してエンベロープ対称キーが暗号化されます。

1. 暗号化されたデータファイルが Amazon S3 に保存され、暗号化されたエンベロープキーと IV がオブジェクトメタデータとして各ファイルとともに保存されます。暗号化されたエンベロープキーはオブジェクトメタデータ `x-amz-meta-x-amz-key` として、IV はオブジェクトメタデータ `x-amz-meta-x-amz-iv` として保存されます。

エンベロープ暗号化プロセスの詳細については、「[Client-side data encryption with the AWS SDK for Java and Amazon S3](https://aws.amazon.com/articles/2850096021478074)」の記事を参照してください。

暗号化されたデータファイルをアンロードするには、ルートキーの値を認証情報文字列に追加するとともに、ENCRYPTED オプションを指定します。MANIFEST オプションを使用すると、マニフェストファイルも暗号化されます。

```
unload ('select venuename, venuecity from venue')
to 's3://amzn-s3-demo-bucket/encrypted/venue_' 
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
master_symmetric_key '<root_key>' 
manifest
encrypted;
```

アンロードしようとする暗号化済みデータファイルが GZIP 圧縮されている場合は、GZIP オプションをルートキーの値および ENCRYPTED オプションとともに指定します。

```
unload ('select venuename, venuecity from venue')
to 's3://amzn-s3-demo-bucket/encrypted/venue_' 
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
master_symmetric_key '<root_key>' 
encrypted gzip;
```

暗号化されたデータファイルをロードするには、同じルートキーの値を含めながら MASTER\$1SYMMETRIC\$1KEY パラメータを追加し、さらに ENCRYPTED オプションを指定します。

```
copy venue from 's3://amzn-s3-demo-bucket/encrypted/venue_' 
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
master_symmetric_key '<root_key>' 
encrypted;
```

# 区切り文字付きまたは固定幅形式でデータをアンロードする
<a name="t_unloading_fixed_width_data"></a>

データのアンロードは、区切り文字付き形式と固定幅形式のどちらでも可能です。デフォルトでは、出力はパイプ文字 (\$1) で区切られます。

次に示す例では、カンマを区切り文字として指定しています。

```
unload ('select * from venue')
to 's3://amzn-s3-demo-bucket/tickit/venue/comma' 
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
delimiter ',';
```

生成される出力ファイルは次のようになります。

```
20,Air Canada Centre,Toronto,ON,0
60,Rexall Place,Edmonton,AB,0
100,U.S. Cellular Field,Chicago,IL,40615
200,Al Hirschfeld Theatre,New York City,NY,0
240,San Jose Repertory Theatre,San Jose,CA,0
300,Kennedy Center Opera House,Washington,DC,0
...
```

同じ結果セットをアンロードしてタブ区切りファイルに出力するには、次のコマンドを実行します。

```
unload ('select * from venue') 
to 's3://amzn-s3-demo-bucket/tickit/venue/tab' 
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
delimiter as '\t';
```

代わりに、FIXEDWIDTH 指定を使用することもできます。この指定は、各テーブル列の識別子と、その列の幅 (文字数) で構成されます。幅が不足している場合は、データが切り捨てられるのではなく UNLOAD コマンドが異常終了するので、指定する幅は、その列の最も長いエントリの長さ以上となるようにしてください。固定幅データのアンロードの動作は、区切り文字付きのデータのアンロードに似ています。異なるのは、生成される出力の中に区切り文字が含まれていない点です。次に例を示します。

```
unload ('select * from venue')
to 's3://amzn-s3-demo-bucket/tickit/venue/fw' 
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
fixedwidth '0:3,1:100,2:30,3:2,4:6';
```

固定幅の出力は次のようになります。

```
20 Air Canada Centre         Toronto      ON0
60 Rexall Place              Edmonton     AB0
100U.S. Cellular Field       Chicago      IL40615
200Al Hirschfeld Theatre     New York CityNY0
240San Jose Repertory TheatreSan Jose     CA0
300Kennedy Center Opera HouseWashington   DC0
```

FIXEDWIDTH 仕様についての詳細は、[UNLOAD](r_UNLOAD.md) コマンドを参照してください。

# アンロードしたデータを再ロードする
<a name="t_Reloading_unload_files"></a>

アンロード操作の結果を再ロードするには、COPY コマンドを使用します。

次に示す単純な例では、マニフェストファイルを使用して VENUE テーブルをアンロードし、テーブルの全データを削除してから、再ロードしています。

```
unload  ('select * from venue order by venueid')
to 's3://amzn-s3-demo-bucket/tickit/venue/reload_' 
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole' 
manifest 
delimiter '|';

truncate venue;

copy venue 
from 's3://amzn-s3-demo-bucket/tickit/venue/reload_manifest' 
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
manifest 
delimiter '|';
```

再ロードの後の VENUE テーブルは次のようになります。

```
select * from venue order by venueid limit 5;

 venueid |         venuename         |  venuecity  | venuestate | venueseats
---------+---------------------------+-------------+------------+-----------
       1 | Toyota Park               | Bridgeview  | IL         |          0
       2 | Columbus Crew Stadium     | Columbus    | OH         |          0
       3 | RFK Stadium               | Washington  | DC         |          0
       4 | CommunityAmerica Ballpark | Kansas City | KS         |          0
       5 | Gillette Stadium          | Foxborough  | MA         |      68756
(5 rows)
```