

 从补丁 198 开始，Amazon Redshift 将不再支持创建新的 Python UDF。现有的 Python UDF 将继续正常运行至 2026 年 6 月 30 日。有关更多信息，请参阅[博客文章](https://www.amazonaws.cn/blogs/big-data/amazon-redshift-python-user-defined-functions-will-reach-end-of-support-after-june-30-2026/)。

# 将数据卸载到 Amazon S3
<a name="t_Unloading_tables"></a>

Amazon Redshift 将 SELECT 语句的结果拆分到一组文件（每个节点切片分成一个或多个文件），以便并行重新加载数据。或者，您也可以通过添加 PARALLEL OFF 选项指定 [UNLOAD](r_UNLOAD.md) 将结果串行写入到一个或多个文件。您可以通过指定 MAXFILESIZE 参数来限制 Amazon S3 中文件的大小。UNLOAD 使用 Amazon S3 服务器端加密 (SSE-S3) 自动加密数据文件。

您可以在 UNLOAD 命令中使用 Amazon Redshift 支持的任意 SELECT 语句，但在外部选择中使用 LIMIT 子句的 SELECT 语句除外。例如，您可以使用包含特定列或使用 WHERE 子句联接多个表的 SELECT 语句。如果查询包含引号（例如，引号中含有文本值），则您需要在查询文本中对其进行转义 (\$1')。有关更多信息，请参阅 [SELECT](r_SELECT_synopsis.md) 命令参考。有关使用 LIMIT 子句的更多信息，请参阅 UNLOAD 命令的 [使用说明](r_UNLOAD.md#unload-usage-notes)。

例如，下面的 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。如果数据大小超过最大大小，则 UNLOAD 会创建新的文件，每个文件最大可达 6.2 GB。

下面的示例将内容 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 命令旨在使用并行处理。对于大多数情况，特别是文件将用于通过 COPY 命令加载表时，我们建议保留 PARALLEL 为启用状态。

假设 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"}
  ]
}
```

清单文件可用于通过使用包含 MANIFEST 选项的 COPY 来加载相同的文件。有关更多信息，请参阅 [使用清单指定数据文件](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;
```