Amazon Redshift
数据库开发人员指南 (API 版本 2012-12-01)
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 Amazon AWS 入门

将数据卸载到 Amazon S3

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

您可以在 UNLOAD 命令中使用 Amazon Redshift 支持的任意 SELECT 语句,但在外部选择中使用 LIMIT 子句的 SELECT 语句除外。例如,您可以使用包含特定列或使用 WHERE 子句联接多个表的 SELECT 语句。如果查询包含引号(例如,引号中含有文本值),则您需要在查询文本中对其进行转义 (\')。有关更多信息,请参阅 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 根据群集中切片的数量将数据并行写入到多个文件。要将数据写入到单个文件中,请指定 PARALLEL OFF。UNLOAD 按照 ORDER BY 子句(如果使用的话)的绝对排序串行写入数据。数据文件的最大大小为 6.2 GB。如果数据大小超过最大大小,则 UNLOAD 会创建新的文件,每个文件最大可达 6.2 GB。

下面的示例将内容 VENUE 写入到单个文件。文件大小不超过 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 的内容写入 50 个文件,每个文件的大小为 100 MB。

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 ('select * from venue') to 's3://mybucket/tickit/venue_' access_key_id '<access-key-id>' secret_access_key '<secret-access-key>' session_token '<temporary-token>';

重要

临时安全凭证在 UNLOAD 语句的整个期间内必须有效。如果临时安全凭证在加载过程中过期,则 UNLOAD 将失败,事务将被回滚。例如,如果临时安全凭证在 15 分钟后过期而 UNLOAD 需要一个小时,则 UNLOAD 将在完成前失败。

您可以通过在 UNLOAD 命令中指定 MANIFEST 选项来创建列出卸载文件的清单文件。清单是一个 JSON 格式的文本文件,其中显式列出写入到 Amazon S3 的每个文件的 URL。

下面的示例包含了清单选项。

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

下面的示例显示了四个卸载文件的清单。

{ "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"} ] }

清单文件可用于通过使用包含 MANIFEST 选项的 COPY 来加载相同的文件。有关更多信息,请参阅 使用清单指定数据文件

完成 UNLOAD 操作后,导航到 UNLOAD 写入文件的 Amazon S3 存储桶,确认数据已正确卸载。您会看到一个或多个按切片编号的文件(编号从零开始)。如果您指定了 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 列表操作;但是,根据您发出调用的速度,列表可能不完整,因为 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 可能会将文件按每个切片分成多个部分。例如:

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;