

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

# 将数据湖表添加到数据共享中
<a name="create-datashare-external-views"></a>

通过数据共享，数据*生产者*可以与同一 Amazon 账户或不同账户的*使用者*安全地共享细粒度的数据库对象，如架构和表。生产者还可以跨区域共享对象。本主题介绍如何将数据湖中的对象（特别是 Amazon Glue 数据目录中的对象）添加到数据共享中。涵盖两种应用场景：
+ *向引用数据湖中表的数据共享添加后期绑定视图* – 这对使用者来说很方便，因为初步配置（如使用 Lake Formation 定义外部源数据的权限）很可能已经完成。另外一个好处是，添加到数据共享的视图可以将数据湖中的表与 Redshift 原生表联接起来。
+ *将外部架构中的表直接添加到数据共享中* – 这使得数据湖中的对象无需额外的层或逻辑即可提供给使用者。使用者可以查询表或将其与使用者上的表联接起来。

使用 [CREATE EXTERNAL SCHEMA](https://docs.amazonaws.cn/redshift/latest/dg/r_CREATE_EXTERNAL_SCHEMA.html) 从 Redshift 中的 Amazon 数据目录引用表后，这些情况将适用。Amazon 数据目录中的任何表都可以是源表。

**注意**  
添加到数据共享的数据湖表可以包括在 Lake Formation 中注册的表和 Amazon Glue 数据目录表。

## 创建外部架构和外部表
<a name="create-datashare-console-external-prelim"></a>

您需要创建外部架构和外部表，以便在接下来的各节中将它们添加到数据共享中。这些都是初步步骤。如果您已经完成此操作，则可跳过此部分。

1. 在生产者上创建外部架构，引用存储在 Amazon S3 中的数据湖数据。外部架构引用 Amazon Glue Data Catalog。示例中的角色和区域就是例子：

   ```
   CREATE EXTERNAL SCHEMA external_schema_name FROM DATA CATALOG
   DATABASE 'glue_database_name'
   IAM_ROLE 'arn:aws:iam::123456789012:role/sample-role'
   REGION 'us-east-1';
   ```

1. 在外部架构中创建数据湖表。

   ```
   CREATE EXTERNAL TABLE external_schema_name.sales(
   salesid INTEGER,
   sellerid INTEGER,
   buyerid INTEGER,
   saledate DATE,
   pricepaid DECIMAL(8,2))
   ROW FORMAT delimited
   FIELDS TERMINATED BY '\t'
   STORED AS textfile
   LOCATION 's3://redshift-downloads/tickit/spectrum/sales/';
   ```

   示例包括 `LOCATION`。格式必须为 `s3://{bucket_name}/{folder}/`，其中指定了文件夹。文件夹的长度必须至少为一个字符。您可以选择包含子文件夹。要查看在数据湖中创建表的其它示例，请参阅 CREATE EXTERNAL TABLE 的[示例](https://docs.amazonaws.cn/redshift/latest/dg/r_CREATE_EXTERNAL_TABLE_examples.html)。
**注意**  
只有生产者的 IAM 角色对表有 SELECT 访问权限的表才支持共享。

## 在数据共享中添加引用数据湖表的后期绑定视图
<a name="create-datashare-console-external-views-how-to"></a>

根据 Amazon 数据目录中的外部架构创建表并将其添加到数据共享中时，最常见的方法是添加一个 Redshift 后期绑定视图，该视图会引用您创建的表，其中包含数据湖中的数据。以下是操作步骤：

1. 创建一个引用之前创建的外部表的后期绑定视图：

   ```
   CREATE VIEW lbv AS 
   select * from external_schema_name.sales, other_schema.t1
   WITH NO SCHEMA BINDING;
   ```

1. 将视图架构添加到数据共享中。这是包含后期绑定视图的本地架构。

   ```
   ALTER DATASHARE dsx_datashare ADD SCHEMA public;
   ```

1. 将包含后期绑定视图所引用的表的架构添加到数据共享中。对于添加到数据共享的视图中引用的任何基本表，无论架构包含本地数据库对象还是数据湖中的对象，都需要添加架构。请注意，必须在添加后期绑定视图之前添加此架构。

   ```
   ALTER DATASHARE dsx_datashare ADD SCHEMA external_schema_name;
   ALTER DATASHARE dsx_datashare ADD SCHEMA other_schema;
   ```

1. 使用 SQL 命令将视图添加到数据共享。请注意，表名包括架构前缀。

   ```
   ALTER DATASHARE my_datashare ADD TABLE public.lbv;
   ```

1. 确认视图和架构已成功添加到数据共享：

   ```
   SELECT * FROM svv_datashare_objects WHERE share_name = 'my_datashare';
   ```

1. 使用者管理员从数据共享中创建一个数据库，然后将使用权授予给使用者用户。

完成这些步骤后，可以访问数据共享视图的数据库使用者用户就可以查询数据了。

## 将数据湖表直接添加到数据共享
<a name="create-datashare-console-external-views-add-spectrum"></a>

在数据共享中添加外部架构中的表与添加视图类似。如果使用者想查询数据湖表的原始状态，或者想将其联接到使用者数据仓库中的表，这种方法就很有效。下面的步骤将向您展示如何使用 SQL 将数据湖表添加到数据共享中。

1. 如本主题第一节所述，创建外部架构和外部表。

1. 

   发现外部架构中的现有表，以确认创建的表可用：

   ```
   SELECT * FROM svv_external_tables WHERE schemaname = 'external_schema_name';
   ```

1. 将外部架构添加到数据共享中：

   ```
   ALTER DATASHARE my_datashare ADD SCHEMA external_schema_name;
   ```

1. 将外部表添加到数据共享中。请注意，表名包括架构前缀：

   ```
   ALTER DATASHARE my_datashare ADD TABLE external_schema_name.sales;
   ```

1. 确认表已成功添加到数据共享中：

   ```
   SELECT * FROM svv_datashare_objects WHERE share_name = 'my_datashare';
   ```

   有关更详细的说明，请参阅[共享 Amazon 账户内数据的读取权限](https://docs.amazonaws.cn/redshift/latest/dg/within-account.html)。

1. 在使用者（即接收共享数据的数据库）上，管理员关联数据共享，使共享表可供用户查询。有关如何执行此步骤的更多信息，请参阅[以使用者身份管理来自其它账户的数据共享](manage-datashare-other-console.html)。

管理员完成这些步骤后，使用者上的数据库用户就可以编写查询，从共享表中检索数据，并将其与使用者上的其它表联接起来。

## 将数据湖对象添加到数据共享的使用说明
<a name="create-datashare-console-external-views-considerations"></a>

在数据共享中使用数据湖中的表和视图时，需要注意以下几点：
+ **使用 Amazon CloudTrail 进行日志记录** - 数据生产者账户可以使用 Amazon CloudTrail 日志，在访问通过数据共享共享的数据湖表时进行审计：
  + **使用日志数据控制数据访问** – CloudTrail 日志记录了谁访问共享表的详细信息，包括 Redshift 数据共享生产者和使用者。标识符可在 `AssumeRole` CloudTrail 日志下的 `ExternalId` 字段中找到。数据所有者可以通过操作在 IAM 策略中配置数据访问的附加限制。有关通过策略定义数据访问权限的更多信息，请参阅[访问第三方拥有的 Amazon 账户](https://docs.amazonaws.cn/IAM/latest/UserGuide/id_roles_common-scenarios_third-party.html)。
+ **安全和使用者权限** – 对于 Lake Formation 注册的表，Amazon S3 资源由 Lake Formation 保护，并使用 Lake Formation 提供的凭证可用。

## 将数据湖对象添加到数据共享的计费注意事项
<a name="create-datashare-console-external-views-billing"></a>

下面将详细介绍在数据共享中存储和扫描数据湖对象的成本归属：
+ 当使用者查询数据湖中的共享对象时，扫描成本将由使用者承担。
  + 当使用者是预置集群时，Redshift 会使用 Redshift Spectrum 扫描 Amazon S3 数据。因此，Spectrum 费用将计入使用者账户。
  + 如果使用者是 Amazon Redshift Serverless 工作组，则无需单独支付 Spectrum 费用。
+ Amazon S3 的存储和操作（如列出存储桶）费用是向拥有每个 Amazon S3 存储桶的账户收取的。

有关 Amazon Redshift Serverless 计费的其它详细信息，请参阅 [Amazon Redshift Serverless 计费](https://docs.amazonaws.cn/redshift/latest/mgmt/serverless-billing.html)。更多计费和定价信息，请访问 [Amazon Redshift 定价](https://www.amazonaws.cn/redshift/pricing/)。