

 从补丁 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/)。

# Amazon Redshift Spectrum 中的外部架构
<a name="c-spectrum-external-schemas"></a>

本主题介绍如何在 Redshift Spectrum 中创建和使用外部架构。外部架构是表的集合，您可以将其用作访问 Amazon Redshift 集群以外数据的引用。这些表包含有关 Redshift Spectrum 读取的外部数据的元数据。

所有外部表都必须在您使用 [CREATE EXTERNAL SCHEMA](r_CREATE_EXTERNAL_SCHEMA.md) 语句创建的外部 schema 中创建。

**注意**  
某些应用程序将术语*数据库* 和* schema * 互换使用。在 Amazon Redshift 中，我们使用术语 *schema*。

Amazon Redshift 外部 schema 引用了外部数据目录中的外部数据库。您可在 Amazon Redshift、[Amazon Athena](https://docs.aws.amazon.com/athena/latest/ug/catalog.html)、[AWS Glue Data Catalog](https://docs.aws.amazon.com/glue/latest/dg/components-overview.html#data-catalog-intro) 或在 Apache Hive 元存储（如 [Amazon EMR](https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-what-is-emr.html)）中创建外部数据库。如果您在 Amazon Redshift 中创建了外部数据库，该数据库将驻留在 Athena Data Catalog 中。要在 Hive 元存储中创建数据库，您需要在您的 Hive 应用程序中创建数据库。

Amazon Redshift 需要授权才能代表您访问 Athena 中的 Data Catalog 和 Amazon S3 中的数据文件。要提供授权，您首先应创建 AWS Identity and Access Management (IAM) 角色。然后，您应将该角色附加到您的集群并在 Amazon Redshift `CREATE EXTERNAL SCHEMA` 语句中为该角色提供 Amazon 资源名称 (ARN)。有关 授权的更多信息，请参阅[适用于 Amazon Redshift Spectrum 的 IAM 策略](c-spectrum-iam-policies.md)。

要在创建外部 schema 的同时创建外部数据库，请指定 `FROM DATA CATALOG` 并在您的 `CREATE EXTERNAL DATABASE` 语句中包含 `CREATE EXTERNAL SCHEMA` 子句。

以下示例使用外部数据库 `spectrum_schema` 创建名为 `spectrum_db` 的外部 schema。

```
create external schema spectrum_schema from data catalog 
database 'spectrum_db' 
iam_role 'arn:aws:iam::123456789012:role/MySpectrumRole'
create external database if not exists;
```

如果您使用 Athena 管理您的数据目录，请指定 Athena 数据库名称和 Athena Data Catalog 所在的 AWS 区域。

以下示例使用 Athena Data Catalog 中的默认 `sampledb` 数据库创建外部 schema。

```
create external schema athena_schema from data catalog 
database 'sampledb' 
iam_role 'arn:aws:iam::123456789012:role/MySpectrumRole' 
region 'us-east-2';
```

**注意**  
`region` 参数将引用 Athena Data Catalog 所在的 AWS 区域而不是数据文件在 Amazon S3 中的位置。

如果使用 Hive 元存储（例如 Amazon EMR）来管理数据目录，则必须将安全组配置为允许集群之间的流量。

在 CREATE EXTERNAL SCHEMA 语句中，指定 `FROM HIVE METASTORE` 并包含元存储的 URI 和端口号。以下示例创建一个使用名为 `hive_db` 的 Hive 元存储数据库的外部 schema。

```
create external schema hive_schema
from hive metastore
database 'hive_db'
uri '172.10.10.10' port 99
iam_role 'arn:aws:iam::123456789012:role/MySpectrumRole'
```

要查看集群的外部 schema，请查询 PG\$1EXTERNAL\$1SCHEMA 目录表或 SVV\$1EXTERNAL\$1SCHEMAS 视图。下面的示例查询联接 PG\$1EXTERNAL\$1SCHEMA 和 PG\$1NAMESPACE 的 SVV\$1EXTERNAL\$1SCHEMAS。

```
select * from svv_external_schemas
```

有关完整的命令语法和示例，请参阅 [CREATE EXTERNAL SCHEMA](r_CREATE_EXTERNAL_SCHEMA.md)。

## 在 Amazon Redshift Spectrum 中使用外部目录
<a name="c-spectrum-external-catalogs"></a>

Amazon Redshift Spectrum 外部数据库和外部表的元数据存储在外部数据目录中。预设情况下，Redshift Spectrum 元数据存储在 Athena Data Catalog 中。您可在 Athena 控制台中查看和管理 Redshift Spectrum 数据库和表。

您还可使用 Hive 数据定义语言 (DDL) 通过 Athena 或 Hive 元存储（如 Amazon EMR）创建和管理外部数据库和外部表。

**注意**  
我们建议使用 Amazon Redshift 在 Redshift Spectrum 中创建和管理外部数据库和外部表。

### 在 Athena 和 AWS Glue 中查看 Redshift Spectrum 数据库
<a name="c-spectrum-athena-external-catalogs"></a>

您可以通过将 CREATE EXTERNAL DATABASE IF NOT EXISTS 子句作为 CREATE EXTERNAL SCHEMA 语句的一部分来创建外部数据库。在此情况下，外部数据库元数据将存储在您的数据目录中。您创建的由外部 schema 限定的外部表的元数据也存储在您的 Data Catalog 中。

Athena 和 AWS Glue 将为每个受支持的 AWS 区域保留一个数据目录。要查看表元数据，请登录 Athena 或 AWS Glue 控制台。在 Athena 中，依次选择**数据来源**和您的 AWS Glue，然后查看数据库的详细信息。在 AWS Glue 中，依次选择**数据库**和您的外部数据库，然后查看数据库的详细信息。

如果您使用 Athena 创建和管理您的外部表，请使用 CREATE EXTERNAL SCHEMA 注册数据库。例如，以下命令将注册名为 `sampledb` 的 Athena 数据库。

```
create external schema athena_sample
from data catalog
database 'sampledb'
iam_role 'arn:aws:iam::123456789012:role/mySpectrumRole'
region 'us-east-1';
```

当您查询 SVV\$1EXTERNAL\$1TABLES 系统视图时，您将看到 Athena `sampledb` 数据库中的表以及您在 Amazon Redshift 中创建的表。

```
select * from svv_external_tables;
```

```
schemaname    | tablename        | location                                               
--------------+------------------+--------------------------------------------------------
athena_sample | elb_logs         | s3://athena-examples/elb/plaintext           
athena_sample | lineitem_1t_csv  | s3://myspectrum/tpch/1000/lineitem_csv                
athena_sample | lineitem_1t_part | s3://myspectrum/tpch/1000/lineitem_partition          
spectrum      | sales            | s3://redshift-downloads/tickit/spectrum/sales          
spectrum      | sales_part       | s3://redshift-downloads/tickit/spectrum/sales_part
```

### 注册 Apache Hive 元存储数据库
<a name="c-spectrum-hive-metastore"></a>

如果您在 Apache Hive 元存储中创建外部表，则可使用 CREATE EXTERNAL SCHEMA 在 Redshift Spectrum 中注册这些表。

在 CREATE EXTERNAL SCHEMA 语句中，指定 FROM HIVE METASTORE 子句并提供 Hive 元存储 URI 和端口号。IAM 角色必须包含对 Amazon S3 的访问权限，但无需任何 Athena 权限。以下示例注册 Hive 元存储。

```
create external schema if not exists hive_schema
from hive metastore
database 'hive_database'
uri 'ip-10-0-111-111.us-west-2.compute.internal' port 9083 
iam_role 'arn:aws:iam::123456789012:role/mySpectrumRole';
```

### 使您的 Amazon Redshift 集群能够访问您的 Amazon EMR 集群
<a name="c-spectrum-enabling-emr-access"></a>

如果 Hive 元存储位于 Amazon EMR 中，则您必须为您的 Amazon Redshift 集群授予访问 Amazon EMR 集群的权限。为此，请创建一个 Amazon EC2 安全组。之后，应允许从您的 Amazon Redshift 集群的安全组和您的 Amazon EMR 集群的安全组到 EC2 安全组的所有入站流量。然后，您应将 EC2 安全组添加到您的 Amazon Redshift 集群和您的 Amazon EMR 集群。

**查看您的 Amazon Redshift 集群的安全组名称**

要显示安全组，请执行以下操作：

1. 登录到 AWS 管理控制台并打开 Amazon Redshift 控制台，网址：[https://console.aws.amazon.com/redshiftv2/](https://console.aws.amazon.com/redshiftv2/)。

1. 在导航菜单上，选择**集群**，然后从列表中选择该集群以打开其详细信息。

1. 选择**属性**并查看**网络和安全设置**部分。

1. 在 **VPC 安全组**中找到您的安全组并记下它。

****

**查看 Amazon EMR 主节点安全组名称**

1. 打开您的 Amazon EMR 集群。有关更多信息，请参阅《Amazon EMR 管理指南》**中的[使用安全配置设置集群安全性](https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-security-configurations.html)。

1. 在**安全与访问**下，记下 Amazon EMR 主节点安全组名称。  
![\[在 Amazon EMR 控制台中突出显示 Amazon EMR 主节点安全组名称的屏幕截图。\]](http://docs.aws.amazon.com/zh_cn/redshift/latest/dg/images/spectrum-emr-security-groups.png)

**创建或修改 Amazon EC2 安全组以允许 Amazon Redshift 和 Amazon EMR 之间的连接：**

1. 在 Amazon EC2 控制面板中，选择**安全组**。有关更多信息，请参阅*《Amazon EC2 用户指南》*中的[安全组规则](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/security-group-rules.html)。

1. 选择**创建安全组**。

1. 如果使用的是 VPC，选择 Amazon Redshift 和 Amazon EMR 集群所在的 VPC。

1. 添加一条入站规则。

   1. 对于**类型**，选择**自定义 TCP**。

   1. 对于 **Source**，选择 **Custom**。

   1. 输入您的 Amazon Redshift 安全组的名称。

1. 再添加一条入站规则。

   1. 对于 **Type**，选择 **TCP**。

   1. 对于**端口范围**，输入 **9083**。
**注意**  
EMR HMS 的默认端口是 9083。如果 HMS 使用了其他的端口，请在入站规则和外部模式定义中指定该端口。

   1. 对于 **Source**，选择 **Custom**。

1. 输入安全组名称和描述。

1. 选择**创建安全组**。

**将您在上一步中创建的 Amazon EC2 安全组添加到您的 Amazon Redshift 集群：**

1. 在 Amazon Redshift 中，选择您的集群。

1. 选择**属性**。

1. 查看**网络和安全设置**，然后选择**编辑**。

1. 在 **VPC 安全组**中，选择新的安全组名称。

1. 选择**保存更改**。

**将 Amazon EC2 安全组添加到您的 Amazon EMR 集群：**

1. 在 Amazon EMR 中，选择您的集群。有关更多信息，请参阅《Amazon EMR 管理指南》**中的[使用安全配置设置集群安全性](https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-security-configurations.html)。

1. 在 **Hardware** 下，选择主节点的链接。

1. 选择 **EC2 实例 ID**列中的链接。  
![\[在 Amazon EMR 控制台中突出显示 Amazon EC2 实例 ID 值的屏幕截图。\]](http://docs.aws.amazon.com/zh_cn/redshift/latest/dg/images/spectrum-emr-add-security-group.png)

1. 依次选择**操作**、**安全**和**更改安全组**。

1. 在**关联的安全组**中，选择新安全组，然后选择**添加安全组**。

1. 选择**保存**。