Amazon Redshift
数据库开发人员指南 (API Version 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/

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

上面示例创建的文件名包含前缀“venue_”。

Copy
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,因此只需要一个文件。

Copy
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。

Copy
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 会在文件名中使用该前缀。

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

您可以使用临时安全凭证限制用户对您的数据具有的访问权限。临时安全凭证可增强安全性,因为它们时效短,过期后无法重复使用。拥有这些临时安全凭证的用户只能在凭证过期之前访问您的资源。有关更多信息,请参阅 临时安全凭证。若要使用临时访问凭证卸载数据,请使用以下语法:

Copy
unload ('select * from venue') to 's3://mybucket/tickit/venue_' access_key_id '<access-key-id>' secret_access_key '<secret-access-key>' token '<temporary-token>';

重要

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

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

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

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

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

Copy
{ "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”结尾的文件。例如:

Copy
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() 函数返回最新的查询。

Copy
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 可能会将文件按每个切片分成多个部分。例如:

Copy
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\' ')。

Copy
unload ('select venuename, venuecity from venue where venuestate=\'OH\' ') to 's3://mybucket/tickit/venue/ ' iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole';

默认情况下,UNLOAD 宁可执行失败,也不会覆盖目标存储桶中的现有文件。要覆盖现有文件(包括清单文件),请指定 ALLOWOVERWRITE 选项。

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