Amazon Redshift
数据库开发人员指南 (API Version 2012-12-01)
AWS 服务或AWS文档中描述的功能,可能因地区/位置而异。请点击 Amazon AWS 入门,可查看中国地区的具体差异

使用 COPY 命令从 Amazon S3 加载

使用 COPY 命令从 Amazon S3 上的数据文件并行加载表。您可以使用 Amazon S3 对象前缀或清单文件指定要加载的文件。

使用前缀指定要加载的文件的语法如下所示:

copy <table_name> from 's3://<bucket_name>/<object_prefix>' authorization;

清单文件是 JSON 格式的文件,该文件会列出要加载的数据文件。使用清单文件指定要加载的文件的语法如下所示:

copy <table_name> from 's3://<bucket_name>/<manifest_file>' authorization manifest;

数据库中必须已存在要加载的表。有关创建表的信息,请参阅 SQL 参考中的CREATE TABLE

authorization的值为您的群集提供访问 Amazon S3 对象所需的 AWS 授权。有关所需权限的信息,请参阅COPY、UNLOAD 和 CREATE LIBRARY 的 IAM 权限。进行身份验证的首选方法是为具有必要权限的 IAM 角色指定 IAM_ROLE 参数并提供 Amazon 资源名称 (ARN)。您也可以指定 ACCESS_KEY_ID 和 SECRET_ACCESS_KEY 参数,并为授权 IAM 用户提供纯文本形式的访问密钥 ID 和秘密访问密钥。有关更多信息,请参阅 基于角色的访问控制基于密钥的访问控制

要使用 IAM_ROLE 参数进行身份验证,请根据如下语法中所示,替换 <aws-account-id><role-name>

IAM_ROLE 'arn:aws:iam::<aws-account-id>:role/<role-name>'

以下示例使用 IAM 角色进行身份验证。

copy customer from 's3://mybucket/mydata' iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole';

要使用 IAM 用户凭证进行身份验证,请用授权用户的访问密钥 ID 和完整的秘密访问密钥替换 ACCESS_KEY_ID 和 SECRET_ACCESS_KEY 参数的 <access-key-id><secret-access-key,如下所示。

ACCESS_KEY_ID '<access-key-id>' SECRET_ACCESS_KEY '<secret-access-key>';

以下示例使用 IAM 用户凭证进行身份验证。

copy customer from 's3://mybucket/mydata' access_key_id '<access-key-id>' secret_access_key '<secret-access-key';

有关其他授权选项的更多信息,请参阅授权参数

如果您要验证您的数据而不实际加载表,请对 COPY 命令使用 NOLOAD 选项。

以下示例展示了一个名为 venue.txt 的文件中用竖线分隔的数据的前几行。

1|Toyota Park|Bridgeview|IL|0 2|Columbus Crew Stadium|Columbus|OH|0 3|RFK Stadium|Washington|DC|0

在将文件上传到 Amazon S3 之前,将文件拆分成多个文件,以便 COPY 命令使用并行处理来加载它。文件数应为您的群集中的切片数的倍数。拆分您的加载数据文件,使文件大小大约相等,压缩后的文件大小介于 1 MB 和 1 GB 之间。有关更多信息,请参阅 将数据拆分成多个文件

例如,venue.txt 文件可拆分成四个文件,如下所示:

venue.txt.1 venue.txt.2 venue.txt.3 venue.txt.4

以下 COPY 命令将使用 Amazon S3 存储桶 mybucket 中带有前缀“venue”的数据文件中用竖线分隔的数据加载 VENUE 表。

注意

Amazon S3 存储桶 mybucket 在以下示例中不存在。有关使用现有 Amazon S3 存储桶中的实际数据的示例 COPY 命令,请参阅 步骤 4:加载示例数据

copy venue from 's3://mybucket/venue' iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole' delimiter '|';

如果带有键前缀“venue”的 Amazon S3 对象不存在,则加载将失败。