

 Amazon Redshift 將不再支援從修補程式 198 開始建立新的 Python UDFs。現有 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 陳述式的結果分散在一組檔案中，每個節點分割中一或多個檔案，來簡化資料的平行重新載入。或者，您可以指定 [UNLOAD](r_UNLOAD.md)，其應會透過新增 PARALLEL OFF 選項，來依順序將結果寫入至一或多個檔案。您可以透過指定 MAXFILESIZE 參數，來限制 Amazon S3 中的檔案大小。UNLOAD 會自動使用 Amazon S3 伺服器端加密 (SSE-S3) 加密資料檔案。

您可以在 Amazon Redshift 支援的 UNLOAD 命令中使用任何 select 陳述式，除了在外部 select 中使用 LIMIT 子句的 select 以外。例如，您可以使用其中包含特定欄位的 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 會根據叢集中的分割數，將資料平行寫入多個檔案。若要將資料寫入單一檔案，請指定 PARALLEL OFF。UNLOAD 會按順序寫入資料，且如果有使用 ORDER BY 字句，則會根據該子句進行絕對排列。資料檔案大小上限為 6.2 GB。如果資料大小大於上限 (每個高達 6.2 GB)，UNLOAD 會額外建立檔案。

以下範例指會將內容 VENUE 寫入單一檔案。僅需要一個檔案，因為檔案大小少於 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 命令是設計為使用平行處理。我們建議在多數的情況將 PARALLEL 保持為啟用，特別是在使用 COPY 命令將檔案是用來載入表格時。

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

```
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 選項，以建立列出卸載檔案的資訊清單檔案。清單檔案是 JSON 格式的文字檔，其中明確列出寫入 Amazon S3 的每個檔案的 URL。

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

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

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

```
{
  "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 儲存貯體，來確認檔案是否正確卸載。您將會在每個分割看到一或多個含編號的檔案，從編號零開始。如果指定 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
```

您可以在 UNLOAD 完成後呼叫 Amazon S3 清單操作，以程式設計方式取得寫入 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 可能會根據分割將檔案分為多個部分。例如：

```
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 會自動使用 Amazon S3 伺服器端加密，搭配 AWS 受管加密金鑰 (SSE-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;
```

如果您想要提供自己的加密金鑰，您可以透過使用 UNLOAD 命令搭配 ENCRYPTED 選項，在 Amazon S3 中建立用戶端加密的資料檔案。UNLOAD 使用的封套加密程序與 Amazon S3 用戶端加密使用的封套加密程序相同。您可以使用 COPY 命令搭配 ENCRYPTED 選項，來載入加密的檔案。

運作程序如下：

1. 您會建立以 base64 編碼的 256 位元 AES 金鑰，您可以將此金鑰用做為私有加密金鑰或*根對稱金鑰*。

1. 您發出的 UNLOAD 命令包含根對稱金鑰和 ENCRYPTED 選項。

1. UNLOAD 產生一次性的對稱金鑰 (名為*信封對稱金鑰*) 與初始化向量 (IV)，其會使用此向量來加密資料。

1. UNLOAD 會使用根對稱金鑰來加密信封對稱金鑰。

1. UNLOAD 接著會在 Amazon S3 中儲存加密資料檔案，並將每個檔案的加密信封金鑰和 IV 儲存做為物件中繼資料。加密信封金鑰會儲存做為物件中繼資料 `x-amz-meta-x-amz-key` 且 IV 會儲存做為物件中繼資料 `x-amz-meta-x-amz-iv`。

如需信封加密程序的詳細資訊，請參閱[使用適用於 Java 的 AWS SDK 和 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
...
```

若要卸載設為以 Tab 鍵分隔之檔案的相同結果，請發出下列命令：

```
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)
```