

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

# 使用 COPY 命令从 Amazon S3 中加载
<a name="t_loading-tables-from-s3"></a>

使用 [COPY](r_COPY.md) 命令从 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](r_CREATE_TABLE_NEW.md)。

*authorization* 的值提供 Amazon Redshift 访问 Amazon S3 对象所需的 AWS 授权。有关所需权限的信息，请参阅[COPY、UNLOAD 和 CREATE LIBRARY 的 IAM 权限](copy-usage_notes-access-permissions.md#copy-usage_notes-iam-permissions)。进行身份验证的首选方法是为具有必要权限的 IAM 角色指定 IAM\$1ROLE 参数并提供 Amazon 资源名称（ARN）。有关更多信息，请参阅 [基于角色的访问控制](copy-usage_notes-access-permissions.md#copy-usage_notes-access-role-based)。

要使用 IAM\$1ROLE 参数进行身份验证，请替换 *<aws-account-id>* 和 *<role-name>*，如以下语法中所示。

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

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

```
COPY customer 
FROM 's3://amzn-s3-demo-bucket/mydata' 
IAM_ROLE 'arn:aws:iam::0123456789012:role/MyRedshiftRole';
```

有关其他授权选项的更多信息，请参阅[授权参数](copy-parameters-authorization.md)。

如果您要验证您的数据而不实际加载表，请对 [COPY](r_COPY.md) 命令使用 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 之间。有关更多信息，请参阅 [从压缩和未压缩文件中加载数据](t_splitting-data-files.md)。

例如，`venue.txt` 文件可拆分成四个文件，如下所示：

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

以下 COPY 命令将使用 Amazon S3 桶 `amzn-s3-demo-bucket` 中带有前缀“venue”的数据文件中用竖线分隔的数据加载 VENUE 表。

**注意**  
Amazon S3 桶 `amzn-s3-demo-bucket` 在以下示例中不存在。有关使用现有 Amazon S3 桶中的实际数据的示例 COPY 命令，请参阅[加载示例数据](https://docs.aws.amazon.com/redshift/latest/gsg/cm-dev-t-load-sample-data.html)。

```
COPY venue FROM 's3://amzn-s3-demo-bucket/venue'
IAM_ROLE 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
DELIMITER '|';
```

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

**Topics**
+ [使用清单指定数据文件](loading-data-files-using-manifest.md)
+ [从 Amazon S3 中加载压缩的数据文件](t_loading-gzip-compressed-data-files-from-S3.md)
+ [从 Amazon S3 中加载固定宽度的数据](t_loading_fixed_width_data.md)
+ [从 Amazon S3 中加载多字节数据](t_loading_unicode_data.md)
+ [从 Amazon S3 中加载加密的数据文件](c_loading-encrypted-files.md)

# 使用清单指定数据文件
<a name="loading-data-files-using-manifest"></a>

您可以对数据加载使用清单以确保 COPY 命令加载所有需要的文件，且仅加载需要的文件。您可以使用清单来加载不同桶或文件中的未共享相同前缀的文件。您可以提供明确列出要加载的文件的 JSON 格式的文本文件的名称，而不必提供 COPY 命令的对象路径。清单中的 URL 必须指定桶名称和文件的完整对象路径，而不仅仅是前缀。

有关清单文件的更多信息，请参阅 COPY 示例[使用清单指定数据文件](r_COPY_command_examples.md#copy-command-examples-manifest)。

以下示例展示了用于加载不同桶中的文件名以日期戳开头的文件的 JSON。

```
{
  "entries": [
    {"url":"s3://amzn-s3-demo-bucket1/2013-10-04-custdata", "mandatory":true},
    {"url":"s3://amzn-s3-demo-bucket1/2013-10-05-custdata", "mandatory":true},
    {"url":"s3://amzn-s3-demo-bucket2/2013-10-04-custdata", "mandatory":true},
    {"url":"s3://amzn-s3-demo-bucket2/2013-10-05-custdata", "mandatory":true}
  ]
}
```

可选的 `mandatory` 标志指定 COPY 是否应在找不到文件时返回错误。`mandatory` 的默认值为 `false`。如果未找到任何文件，则无论 mandatory 设置如何，COPY 都将终止。

以下示例将使用前一个示例中名为 `cust.manifest` 的清单来运行 COPY 命令。

```
COPY customer
FROM 's3://amzn-s3-demo-bucket/cust.manifest' 
IAM_ROLE 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
MANIFEST;
```

## 使用 UNLOAD 创建的清单
<a name="loading-data-files-using-unload-manifest"></a>

由 [UNLOAD](r_UNLOAD.md) 操作使用 MANIFEST 参数创建的清单可能具有 COPY 操作不需要的键。例如，以下 `UNLOAD` 清单包含一个 `meta` 键，该键是 Amazon Redshift Spectrum 外部表所必需的，并用于加载 `ORC` 或 `Parquet` 文件格式的数据文件。`meta` 键包含具有文件实际大小值（以字节为单位）的 `content_length` 键。COPY 操作只需要 `url` 密钥和可选 `mandatory` 密钥。

```
{
  "entries": [
    {"url":"s3://amzn-s3-demo-bucket/unload/manifest_0000_part_00", "meta": { "content_length": 5956875 }},
    {"url":"s3://amzn-s3-demo-bucket/unload/unload/manifest_0001_part_00", "meta": { "content_length": 5997091 }}
 ]
}
```

有关清单文件的更多信息，请参阅[使用清单指定数据文件](r_COPY_command_examples.md#copy-command-examples-manifest)。

# 从 Amazon S3 中加载压缩的数据文件
<a name="t_loading-gzip-compressed-data-files-from-S3"></a>

要加载使用 gzip、lzop 或 bzip2 压缩的数据文件，请包括相应的选项：GZIP、LZOP 或 BZIP2。

例如，以下命令将从使用 lzop 压缩的文件加载。

```
COPY customer FROM 's3://amzn-s3-demo-bucket/customer.lzo' 
IAM_ROLE 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
DELIMITER '|' LZOP;
```

**注意**  
如果您使用 lzop 压缩来压缩数据文件并使用 *--filter* 选项，则 COPY 命令不支持该文件。

# 从 Amazon S3 中加载固定宽度的数据
<a name="t_loading_fixed_width_data"></a>

固定宽度的数据文件的每个数据列具有统一的长度。固定宽度的数据文件中的每个字段的长度和位置完全相同。对于固定宽度的数据文件中的字符数据（CHAR 和 VARCHAR），您必须包括前导空格或尾随空格作为占位符，以便保持宽度统一。对于整数，您必须使用前导零作为占位符。固定宽度的数据文件没有用于分隔列的分隔符。

要将固定宽度的数据文件加载到现有表，请在 COPY 命令中使用 FIXEDWIDTH 参数。您的表说明必须与 fixedwidth\$1spec 的值相匹配才能正确加载数据。

要将固定宽度的数据从文件加载到表，请发出以下命令：

```
COPY table_name FROM 's3://amzn-s3-demo-bucket/prefix' 
IAM_ROLE 'arn:aws:iam::0123456789012:role/MyRedshiftRole' 
FIXEDWIDTH 'fixedwidth_spec';
```

*fixedwidth\$1spec* 参数是一个字符串，其中包含每个列的标识符和每个列的宽度（用冒号分隔）。**column:width** 对由逗号分隔。标识符可以是您选择的任意形式：数字、字母或二者的组合。标识符与表本身无关，因此说明包含列的顺序必须与表中的列顺序相同。

以下两个示例演示了相同说明，第一个使用数字标识符，第二个使用字符串标识符：

```
'0:3,1:25,2:12,3:2,4:6'
```

```
'venueid:3,venuename:25,venuecity:12,venuestate:2,venueseats:6'
```

以下示例演示了固定宽度的样本数据，可使用前面的说明将这些数据加载到 VENUE 表中：

```
1  Toyota Park               Bridgeview  IL0
2  Columbus Crew Stadium     Columbus    OH0
3  RFK Stadium               Washington  DC0
4  CommunityAmerica Ballpark Kansas City KS0
5  Gillette Stadium          Foxborough  MA68756
```

以下 COPY 命令会将此数据集加载到 VENUE 表中：

```
COPY venue
FROM 's3://amzn-s3-demo-bucket/data/venue_fw.txt' 
IAM_ROLE 'arn:aws:iam::0123456789012:role/MyRedshiftRole' 
FIXEDWIDTH 'venueid:3,venuename:25,venuecity:12,venuestate:2,venueseats:6';
```

# 从 Amazon S3 中加载多字节数据
<a name="t_loading_unicode_data"></a>

如果您的数据包含非 ASCII 多字节字符（例如中文或西里尔语字符），则必须将该数据加载到 VARCHAR 列。VARCHAR 数据类型支持四字节的 UTF-8 字符，而 CHAR 数据类型仅接受单字节的 ASCII 字符。您不能将五字节或更长的字符加载到 Amazon Redshift 表中。有关 CHAR 和 VARCHAR 的更多信息，请参阅[数据类型](c_Supported_data_types.md)。

要检查输入文件使用哪种编码，请使用 Linux * `file` * 命令：

```
$ file ordersdata.txt
ordersdata.txt: ASCII English text
$ file uni_ordersdata.dat
uni_ordersdata.dat: UTF-8 Unicode text
```

# 从 Amazon S3 中加载加密的数据文件
<a name="c_loading-encrypted-files"></a>

您可以使用 COPY 命令加载使用服务器端加密、客户端加密或两种加密方式上载到 Amazon S3 的数据文件。

COPY 命令支持以下 Amazon S3 加密方式：
+ 使用 Amazon S3 托管密钥进行服务器端加密 (SSE-S3)
+ 使用 AWS KMS keys 的服务器端加密 (SSE-KMS)
+ 使用客户端对称根密钥进行客户端加密

COPY 命令不支持以下 Amazon S3 加密方式：
+ 使用客户提供的密钥进行服务器端加密 (SSE-C)
+ 使用 AWS KMS key 进行客户端加密
+ 使用客户提供的对称根密钥进行客户端加密

有关 Amazon S3 加密的更多信息，请参阅《Amazon Simple Storage Service 用户指南》中的[使用服务器端加密保护数据](https://docs.aws.amazon.com/AmazonS3/latest/userguide/serv-side-encryption.html)和[使用客户端加密保护数据](https://docs.aws.amazon.com/AmazonS3/latest/userguide/UsingClientSideEncryption.html)。

[UNLOAD](r_UNLOAD.md) 命令使用 SSE-S3 自动加密文件。您还可以使用 SSE-KMS 或客户托管式对称密钥进行客户端加密的方法进行卸载。有关更多信息，请参阅 [卸载加密的数据文件](t_unloading_encrypted_files.md)。

COPY 命令会自动识别并加载使用 SSE-S3 和 SSE-KMS 进行加密的文件。您可以指定 ENCRYPTED 选项并提供密钥值，加载使用客户端对称根密钥加密的文件。有关更多信息，请参阅 [将加密的数据上载到 Amazon S3](t_uploading-encrypted-data.md)。

要加载客户端加密数据文件，请使用 MASTER\$1SYMMETRIC\$1KEY 参数提供根密钥值，并包括 ENCRYPTED 选项。

```
COPY customer FROM 's3://amzn-s3-demo-bucket/encrypted/customer' 
IAM_ROLE 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
MASTER_SYMMETRIC_KEY '<root_key>' 
ENCRYPTED
DELIMITER '|';
```

要加载 gzip、lzop 或 bzip2 压缩的加密数据文件，请随根密钥值和 ENCRYPTED 选项包括 GZIP、LZOP 或 BZIP2 选项。

```
COPY customer FROM 's3://amzn-s3-demo-bucket/encrypted/customer' 
IAM_ROLE 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
MASTER_SYMMETRIC_KEY '<root_key>'
ENCRYPTED 
DELIMITER '|' 
GZIP;
```