将数据卸载到 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://DOC-EXAMPLE-BUCKET/tickit/unload/
。
unload ('select * from venue') to 's3://DOC-EXAMPLE-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://DOC-EXAMPLE-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://DOC-EXAMPLE-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://DOC-EXAMPLE-BUCKET/tickit/unload/venue_' iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole';
您可以通过在 UNLOAD 命令中指定 MANIFEST 选项来创建列出卸载文件的清单文件。清单是一个 JSON 格式的文本文件,其中显式列出写入到 Amazon S3 的每个文件的 URL。
下面的示例包含了清单选项。
unload ('select * from venue') to 's3://DOC-EXAMPLE-BUCKET/tickit/venue_' iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole' manifest;
下面的示例显示了四个卸载文件的清单。
{ "entries": [ {"url":"s3://DOC-EXAMPLE-BUCKET/tickit/venue_0000_part_00"}, {"url":"s3://DOC-EXAMPLE-BUCKET/tickit/venue_0001_part_00"}, {"url":"s3://DOC-EXAMPLE-BUCKET/tickit/venue_0002_part_00"}, {"url":"s3://DOC-EXAMPLE-BUCKET/tickit/venue_0003_part_00"} ] }
清单文件可用于通过使用包含 MANIFEST 选项的 COPY 来加载相同的文件。有关更多信息,请参阅 使用清单指定数据文件。
完成 UNLOAD 操作后,导航到 UNLOAD 写入文件的 Amazon S3 存储桶,确认数据已正确卸载。您会看到一个或多个按切片编号的文件(编号从零开始)。如果您指定了 MANIFEST 选项,则还会看到以“manifest
”结尾的文件。例如:
DOC-EXAMPLE-BUCKET/tickit/venue_0000_part_00 DOC-EXAMPLE-BUCKET/tickit/venue_0001_part_00 DOC-EXAMPLE-BUCKET/tickit/venue_0002_part_00 DOC-EXAMPLE-BUCKET/tickit/venue_0003_part_00 DOC-EXAMPLE-BUCKET/tickit/venue_manifest
您可以在 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://DOC-EXAMPLE-BUCKET/venue0000_part_00 2320 | s3://DOC-EXAMPLE-BUCKET/venue0001_part_00 2320 | s3://DOC-EXAMPLE-BUCKET/venue0002_part_00 2320 | s3://DOC-EXAMPLE-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://DOC-EXAMPLE-BUCKET/tickit/venue/ ' iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole';
默认情况下,UNLOAD 宁可执行失败,也不会覆盖目标存储桶中的现有文件。要覆盖现有文件(包括清单文件),请指定 ALLOWOVERWRITE 选项。
unload ('select * from venue') to 's3://DOC-EXAMPLE-BUCKET/venue_pipe_' iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole' manifest allowoverwrite;