

# 使用 AWS Glue 中的 AWS Glue Data Catalog 视图
<a name="catalog-views"></a>

 您可以在 AWS Glue Data Catalog 中创建和管理视图，通常称为 AWS Glue Data Catalog 视图。这些视图非常有用，因为它们支持多个 SQL 查询引擎，也支持跨不同 AWS 服务（例如 Amazon Athena、Amazon Redshift 和 AWS Glue）访问同一视图。您可以使用基于 Apache Iceberg、Apache Hudi 和 Delta Lake 的视图。

 通过在 Data Catalog 中创建视图，您可以在 AWS Lake Formation 中使用资源授予和基于标记的访问控制，来授予对视图的访问权限。使用这种访问控制方法，您无需为创建视图时引用的表配置其他访问权限。这种授予权限的方法称为定义者语义，这些视图称为定义者视图。有关 AWS Lake Formation 中访问控制的更多信息，请参阅《AWS Lake Formation Developer Guide》中的 [Granting and revoking permissions on Data Catalog resources](https://docs.aws.amazon.com/lake-formation/latest/dg/granting-catalog-permissions.html)。

 数据目录视图对于以下用例非常实用：
+  **精细访问控制**：您可以创建一个视图，根据用户所需的权限来限制数据访问。例如，您可以使用 Data Catalog 中的视图来防止不在 HR 部门工作的员工查看个人身份信息（PII）。
+  **完整视图定义**：通过对 Data Catalog 中的视图应用某些筛选条件，可确保视图内可用的数据记录始终完整。
+  **增强的安全性**：用于创建视图的查询定义必须完整，使 Data Catalog 视图不易受到恶意行为者的 SQL 命令的影响。
+  **简单数据共享**：使用 AWS Lake Formation 中的跨账户数据共享功能，无需移动数据即可与其他 AWS 账户共享数据。

## 创建 Data Catalog 视图
<a name="catalog-creating-view"></a>

 您可以利用 AWS CLI 和使用 Spark SQL 的 AWS Glue ETL 脚本创建 Data Catalog 视图。创建 Data Catalog 视图的语法包括将视图类型指定为 `MULTI DIALECT`，将 `SECURITY` 谓词指定为 `DEFINER`，表示定义者视图。

 创建 Data Catalog 视图的 SQL 语句示例：

```
CREATE PROTECTED MULTI DIALECT VIEW database_name.catalog_view SECURITY DEFINER
AS SELECT order_date, sum(totalprice) AS price
FROM source_table
GROUP BY order_date;
```

 创建 Data Catalog 视图后，您可以使用对该视图拥有 AWS Lake Formation“SELECT”权限的 IAM 角色，从 Amazon Athena、Amazon Redshift 或 AWS Glue ETL 作业等服务查询该视图。您无需授予对视图中引用的基础表的访问权限。

 有关创建和配置 Data Catalog 视图的更多信息，请参阅《AWS Lake Formation Developer Guide》中的 [Building AWS Glue Data Catalog views](https://docs.aws.amazon.com/lake-formation/latest/dg/working-with-views.html)。

## 支持的视图操作
<a name="catalog-supported-view-operations"></a>

 以下命令片段展示了使用 Data Catalog 视图的各种方法：

 **CREATE VIEW** 

 创建数据目录视图。以下示例演示如何根据现有表格创建视图：

```
CREATE PROTECTED MULTI DIALECT VIEW catalog_view 
SECURITY DEFINER AS SELECT * FROM my_catalog.my_database.source_table
```

 **ALTER VIEW** 

 可用语法：

```
ALTER VIEW view_name [FORCE] ADD DIALECT AS query
ALTER VIEW view_name [FORCE] UPDATE DIALECT AS query
ALTER VIEW view_name DROP DIALECT
```

 您可以使用 `FORCE ADD DIALECT` 选项，根据新的引擎方言强制更新架构和子对象。请注意，如果不同时使用 `FORCE` 更新其他引擎方言，这样做可能会导致查询错误。示例如下：

```
ALTER VIEW catalog_view FORCE ADD DIALECTAS
SELECT order_date, sum(totalprice) AS priceFROM source_tableGROUP BY orderdate;
```

 下例显示了如何更改视图来更新方言：

```
ALTER VIEW catalog_view UPDATE DIALECT AS
SELECT count(*) FROM my_catalog.my_database.source_table;
```

 **DESCRIBE VIEW** 

 描述视图的可用语法：

 `SHOW COLUMNS {FROM|IN} view_name [{FROM|IN} database_name]`：如果用户具有描述视图所需的 AWS Glue 和 AWS Lake Formation 权限，则可列出相应列。下面显示了几个用于显示列的示例命令：

```
SHOW COLUMNS FROM my_database.source_table;    
SHOW COLUMNS IN my_database.source_table;
```

 `DESCRIBE view_name`：如果用户具有描述视图所需的 AWS Glue 和 AWS Lake Formation 权限，则可列出视图中的相应列及其元数据。

 **DROP VIEW** 

 可用语法：

```
DROP VIEW [ IF EXISTS ] view_name
```

 以下示例显示了 `DROP` 语句，该语句用于在删除视图之前测试视图是否存在：

```
DROP VIEW IF EXISTS catalog_view;
```

 `SHOW CREATE VIEW view_name`：显示创建指定视图的 SQL 语句。以下示例演示如何创建数据目录视图：

```
SHOW CREATE TABLE my_database.catalog_view;CREATE PROTECTED MULTI DIALECT VIEW my_catalog.my_database.catalog_view (
  net_profit,
  customer_id,
  item_id,
  sold_date)
TBLPROPERTIES (
  'transient_lastDdlTime' = '1736267222')
SECURITY DEFINER AS SELECT * FROM
my_database.store_sales_partitioned_lf WHERE customer_id IN (SELECT customer_id from source_table limit 10)
```

 **SHOW VIEWS** 

 列出目录中的所有视图，例如常规视图、多方言视图（MDV）和没有 Spark 方言的 MDV。可用语法如下：

```
SHOW VIEWS [{ FROM | IN } database_name] [LIKE regex_pattern]:
```

 下面显示了用于显示视图的示例命令：

```
SHOW VIEWS IN marketing_analytics LIKE 'catalog_view*';
```

 有关创建和配置 Data Catalog 视图的更多信息，请参阅《AWS Lake Formation Developer Guide》中的 [Building AWS Glue Data Catalog views ](https://docs.aws.amazon.com/lake-formation/latest/dg/working-with-views.html)。

## 查询 Data Catalog 视图
<a name="catalog-view-query"></a>

 创建 Data Catalog 视图后，即可查询视图。在 AWS Glue 作业中配置的 IAM 角色，必须拥有对 Data Catalog 视图的 Lake Formation **SELECT** 权限。您无需授予对视图中引用的基础表的访问权限。

 完成所有设置后，就可以查询视图。例如运行以下查询来访问视图。

```
SELECT * from my_database.catalog_view LIMIT 10;
```

## 限制
<a name="catalog-view-limitations"></a>

 使用数据目录视图时，请考虑以下限制。
+  只能使用 AWS Glue 5.0 及更高版本来创建 Data Catalog 视图。
+  Data Catalog 视图定义者必须拥有对视图访问的基础基表的 `SELECT` 访问权限。如果特定基表对定义者角色施加了任何 Lake Formation 筛选条件，则创建 Data Catalog 视图将失败。
+  在 AWS Lake Formation 中，基表不得具有 `IAMAllowedPrincipals` 数据湖权限。如果有，则会出现错误“**多方言视图只能引用没有 IAMAllowedPrincipals 权限的表**”。
+  该表的 Amazon S3 位置必须注册为 AWS Lake Formation 数据湖位置。如果表未注册，则会出现错误：`Multi Dialect views may only reference AWS Lake Formation managed tables`。有关如何在 AWS Lake Formation 中注册 Amazon S3 位置的信息，请参阅《AWS Lake Formation Developer Guide》中的 [ Registering an Amazon S3 location](https://docs.aws.amazon.com/lake-formation/latest/dg/register-data-lake.html)。
+  只能创建 `PROTECTED` 数据目录视图。不支持 `UNPROTECTED` 视图。
+  在 Data Catalog 视图定义中，既不能引用其他 AWS 账户中的表，也不能引用不同区域中同一账户中的表。
+  要跨账户或区域共享数据，必须使用 AWS Lake Formation 资源链接跨账户和跨区域共享整个视图。
+  不支持用户定义的函数（UDF）。
+  不能在数据目录视图中引用其他视图。