

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 使用 Glue Data Catalog 视图
<a name="SECTION-jobs-glue-data-catalog-views"></a>

您可以在 AWS Glue 数据目录中创建和管理视图，以便与 EMR Serverless 配合使用。这些视图通常被称为 AWS Glue 数据目录视图。这些视图之所以有用，是因为它们支持多个 SQL 查询引擎，因此您可以跨不同的 AWS 服务（例如 EMR Serverless 和 Amazon Redshift）访问相同的视图。 Amazon Athena

通过在数据目录中创建视图，在中使用资源授予和基于标签的访问控制 AWS Lake Formation 来授予对该视图的访问权限。使用这种访问控制方法，您无需为创建视图时引用的表配置其他访问权限。这种授予权限的方法称为定义者语义，这些视图称为定义者视图。有关 Lake Formation 中访问控制的更多信息，请参阅[《Lake Formation 开发者指南》中的授予和撤消数据目录资源的权限](https://docs.aws.amazon.com/lake-formation/latest/dg/granting-catalog-permissions.html)。 AWS 

数据目录视图对于以下用例非常实用：
+ **精细访问控制**：您可以创建一个视图，根据用户所需的权限来限制数据访问。例如，您可以使用 Data Catalog 中的视图来防止不在 HR 部门工作的员工查看个人身份信息 (PII)。
+ **完整视图定义**：通过对 Data Catalog 中的视图应用筛选条件，可确保 Data Catalog 中视图内的数据记录始终完整。
+ **增强安全性**：用于创建视图的查询定义必须完整。这种优势意味着 Data Catalog 中的视图不容易受到恶意行为者的 SQL 命令的影响。
+ **简单共享数据**-无需移动数据即可与其他 AWS 账户共享数据。有关更多信息，请参阅 [Lake Formation 中的跨账户数据共享](https://docs.aws.amazon.com/lake-formation/latest/dg/cross-account-permissions.html)。

## 创建 Data Catalog 视图
<a name="SECTION-jobs-glue-data-catalog-views-create"></a>

创建 Data Catalog 视图的方法有很多种。其中包括使用 AWS CLI 或 Spark SQL。以下是一些示例。

------
#### [ Using SQL ]

下面展示了创建 Data Catalog 视图的语法。注意 `MULTI DIALECT` 视图类型。这将 Data Catalog 视图与其他视图区分开来。`SECURITY` 谓词指定为 `DEFINER`。这表示带有 `DEFINER` 语义的 Data Catalog 视图。

```
CREATE [ OR REPLACE ] PROTECTED MULTI DIALECT VIEW [IF NOT EXISTS] view_name
[(column_name [COMMENT column_comment], ...) ]
[ COMMENT view_comment ]
[TBLPROPERTIES (property_name = property_value, ... )]
SECURITY DEFINER
AS query;
```

以下是 `CREATE` 语句示例，其语法如下：

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

您还可以使用 SQL 在试运行模式下创建视图以测试视图创建，而无需实际创建资源。使用此选项会导致 “试运行”，该试运行可以验证输入，如果验证成功，则返回将代表视图的 Glue AWS 表对象的 JSON。在这种情况下，不会创建实际视图。

```
CREATE [ OR REPLACE ] PROTECTED MULTI DIALECT VIEW view_name
SECURITY DEFINER 
[ SHOW VIEW JSON ]
AS view-sql
```

------
#### [ Using the AWS CLI ]

**注意**  
使用 CLI 命令时，不会解析用于创建视图的 SQL。这可能会导致创建视图，但查询不成功。创建视图之前，请务必测试 SQL 语法。

您可以使用以下 CLI 命令创建视图：

```
aws glue create-table --cli-input-json '{
  "DatabaseName": "database",
  "TableInput": {
    "Name": "view",
    "StorageDescriptor": {
      "Columns": [
        {
          "Name": "col1",
          "Type": "data-type"
        },
        ...
        {
          "Name": "col_n",
          "Type": "data-type"
        }
      ],
      "SerdeInfo": {}
    },
    "ViewDefinition": {
      "SubObjects": [
        "arn:aws:glue:aws-region:aws-account-id:table/database/referenced-table1",
        ...
        "arn:aws:glue:aws-region:aws-account-id:table/database/referenced-tableN",
       ],
      "IsProtected": true,
      "Representations": [
        {
          "Dialect": "SPARK",
          "DialectVersion": "1.0",
          "ViewOriginalText": "Spark-SQL",
          "ViewExpandedText": "Spark-SQL"
        }
      ]
    }
  }
}'
```

------

## 支持的视图操作
<a name="SECTION-jobs-glue-data-catalog-views-supported-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 DIALECT
  AS
  SELECT order_date, sum(totalprice) AS price
  FROM source_table
  GROUP 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 和 Lake Formation 权限，则他们可以列出这些列。下面展示了几个用于显示列的示例命令：

    ```
    SHOW COLUMNS FROM my_database.source_table;    
    SHOW COLUMNS IN my_database.source_table;
    ```
  + `DESCRIBE view_name`— 如果用户具有描述视图所需的 AWS Glue 和 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*';
    ```

有关创建和配置数据目录视图的更多信息，请参阅《 AWS Lake Formation 开发人员指南》中的 B [AWS uilding Glue 数据目录视图](https://docs.aws.amazon.com/lake-formation/latest/dg/working-with-views.html)。

## 查询 Data Catalog 视图
<a name="SECTION-jobs-glue-data-catalog-views-querying"></a>

 创建数据目录视图后，您可以使用启用了 AWS Lake Formation 精细访问控制的 Amazon EMR Serverless Spark 任务对其进行查询。作业运行时角色必须拥有对 Data Catalog 视图的 Lake Formation `SELECT` 权限。您无需授予对视图中引用的基础表的访问权限。

完成所有设置后，就可以查询视图。例如，在 EMR Studio 中创建 EMR Serverless 应用程序后，请运行以下查询来访问视图。

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

一个有用的功能是 `invoker_principal`。它返回 EMRS 作业运行时角色的唯一标识符。这可用于根据调用主体控制视图输出。您可以使用它在视图中添加一个条件，以便根据调用角色优化查询结果。作业运行时角色必须拥有执行 `LakeFormation:GetDataLakePrincipal` IAM 操作的权限才能使用此函数。

```
select invoker_principal();
```

例如，您可以将此函数添加到 `WHERE` 子句以优化查询结果。

## 注意事项和限制
<a name="SECTION-jobs-glue-data-catalog-views-considerations"></a>

创建 Data Catalog 视图时，以下内容适用：
+ 只能使用 Amazon EMR 7.6 及更高版本创建 Data Catalog 视图。
+ Data Catalog 视图定义者必须拥有对视图访问的基础基表的 `SELECT` 访问权限。如果特定基表对定义者角色施加了任何 Lake Formation 筛选条件，则创建 Data Catalog 视图将失败。
+ 在 Lake Formation 中，基表不得具有 `IAMAllowedPrincipals` 数据湖权限。如果存在，则会出现错误 “*多方言视图” 只能引用没有 IAMAllowed委托人权限的表*。
+ 该表的 Amazon S3 位置必须注册为 Lake Formation 数据湖位置。如果该表未注册，则会出现错误*多方言视图只能引用 Lake Formation 托管表*。有关如何在 Lake Formation 中注册亚马逊 S3 营业地点的信息，请参阅 AWS Lake Formation 开发者指南中的[注册亚马逊 S3 营业地点](https://docs.aws.amazon.com/lake-formation/latest/dg/register-location.html)。
+ 只能创建 `PROTECTED` 数据目录视图。不支持 `UNPROTECTED` 视图。
+ 您不能在数据目录视图定义中引用其他 AWS 账户中的表。也不能引用不同区域中同一账户中的表。
+ 要跨账户或区域共享数据，必须使用 Lake Formation 资源链接跨账户和跨区域共享整个视图。
+ 不支持用户定义的函数 (UDFs)。
+ 您可以使用基于 Iceberg 表的视图。还支持开放式表格格式 Apache Hudi 和 Delta Lake。
+ 不能在数据目录视图中引用其他视图。
+  AWS Glue 数据目录视图架构始终使用小写形式存储。例如，如果使用 DDL 语句创建包含名为 `Castle` 的列的 Glue Data Catalog 视图，则在 Glue Data Catalog 中创建的列将被小写为 `castle`。如果您随后将 DML 查询中的列名指定为 `Castle` 或 `CASTLE`，EMR Spark 会将名称转换为小写，以便您运行查询。但是列标题会使用您在查询中指定的大小写形式显示。

  如果您希望在 DML 查询中指定的列名与 Glue Data Catalog 中的列名不匹配时查询失败，请设置 `spark.sql.caseSensitive=true`。