使用 Glue 数据目录视图 - Amazon EMR
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

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

使用 Glue 数据目录视图

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

通过在数据目录中创建视图,您可以在中使用资源授予和基于标签的访问控制 Amazon Lake Formation 来授予对视图的访问权限。使用这种访问控制方法,您无需为创建视图时引用的表配置其他访问权限。这种授予权限的方法称为定义者语义,这些视图称为定义者视图。有关 Lake Formation 中访问控制的更多信息,请参阅《Lake Formation 开发者指南》中的授予和撤消数据目录资源的权限。 Amazon

数据目录视图对于以下用例非常实用:

  • 精细访问控制:您可以创建一个视图,根据用户所需的权限来限制数据访问。例如,您可以使用 Data Catalog 中的视图来防止不在 HR 部门工作的员工查看个人身份信息 (PII)。

  • 完整视图定义-通过对数据目录中的视图应用筛选器,可以确保数据目录中视图中可用的数据记录始终完整。

  • 增强安全性-用于创建视图的查询定义必须完整。此优势意味着数据目录中的视图不易受到恶意行为者的 SQL 命令的影响。

  • 简单共享数据-无需移动数据即可与其他 Amazon 账户共享数据。有关更多信息,请参阅 Lake Formation 中的跨账户数据共享

创建 Data Catalog 视图

创建数据目录视图有不同的方法。其中包括使用 Amazon CLI 或 Spark SQL。以下是几个例子。

Using SQL

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

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 Amazon 表对象的 JSON。在这种情况下,不会创建实际视图。

CREATE [ OR REPLACE ] PROTECTED MULTI DIALECT VIEW view_name SECURITY DEFINER [ SHOW VIEW JSON ] AS view-sql
Using the Amazon 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" } ] } } }'

支持的视图操作

以下命令片段展示了使用 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]— 如果用户拥有描述视图所需的 Amazon Glue 和 Lake Formation 权限,则他们可以列出这些列。下面显示了几个用于显示列的示例命令:

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

有关创建和配置数据目录视图的更多信息,请参阅《 Amazon Lake Formation 开发人员指南》中的 B Amazon uilding Glue 数据目录视图

查询 Data Catalog 视图

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

完成所有设置后,就可以查询视图。例如,在 EMR Studio 中创建 EMR 无服务器应用程序后,您可以运行以下查询来访问视图。

SELECT * from my_database.catalog_view LIMIT 10;

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

select invoker_principal();

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

注意事项和限制

创建数据目录视图时,以下内容适用:

  • 您只能使用 Amazon EMR 7.6 及更高版本创建数据目录视图。

  • Data Catalog 视图定义者必须拥有对视图访问的基础基表的 SELECT 访问权限。如果特定基表对定义者角色施加了任何 Lake Formation 筛选条件,则创建 Data Catalog 视图将失败。

  • 在 Lake Formation 中,基表不得具有IAMAllowedPrincipals数据湖权限。如果存在,则会出现错误 “多方言视图” 只能引用没有 IAMAllowed委托人权限的表

  • 该表的 Amazon S3 位置必须注册为 Lake Formation 数据湖位置。如果表未注册,则会出现错误 “多方言视图只能引用 Lake Formation 托管表”。有关如何在 Lake Formation 中注册亚马逊 S3 营业地点的信息,请参阅 Amazon Lake Formation 开发者指南中的注册亚马逊 S3 营业地点

  • 只能创建 PROTECTED 数据目录视图。不支持 UNPROTECTED 视图。

  • 您不能在数据目录视图定义中引用其他 Amazon 账户中的表。也不能引用不同区域中同一账户中的表。

  • 要跨账户或区域共享数据,必须使用 Lake Formation 资源链接跨账户和跨区域共享整个视图。

  • 不支持用户定义的函数 (UDFs)。

  • 您可以使用基于 Iceberg 表的视图。还支持开放式表格格式 Apache Hudi 和 Delta Lake。

  • 不能在数据目录视图中引用其他视图。

  • Amazon Glue 数据目录视图架构始终使用小写形式存储。例如,如果您使用 DDL 语句创建具有名为的列的 Glue 数据目录视图Castle,则在 Glue 数据目录中创建的列将变为小写。castle如果您随后在 DML 查询中将列名指定为CastleCASTLE,EMR Spark 会将该名称设为小写以便运行查询。但是列标题使用您在查询中指定的大小写显示。

    如果您希望在 DML 查询中指定的列名与 Glue 数据目录中的列名不匹配的情况下查询失败,则可以设置spark.sql.caseSensitive=true