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

使用 Glue Data Catalog 视图

您可以在 Amazon Glue Data Catalog 中创建和管理视图,以便与 EMR Serverless 结合使用。这些通常称为 Amazon Glue Data Catalog 视图。这些视图非常有用,因为它们支持多个 SQL 查询引擎,您可以跨不同 Amazon 服务(例如 EMR Serverless、Amazon Athena 和 Amazon Redshift)访问同一视图。

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

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

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

  • 完整视图定义 – 通过对 Data Catalog 中的视图应用筛选条件,可确保 Data Catalog 中视图内的数据记录始终完整。

  • 增强安全性 – 用于创建视图的查询定义必须完整。这种优势意味着 Data Catalog 中的视图不容易受到恶意行为者的 SQL 命令的影响。

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

创建 Data Catalog 视图

创建 Data Catalog 视图的方法有很多种。其中包括使用 Amazon 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 在试运行模式下创建视图以测试视图创建,而无需实际创建资源。使用此选项执行“试运行”来以验证输入,如果验证成功,则返回将代表视图的 Amazon Glue 表对象的 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

    • 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 视图的更多信息,请参阅《Amazon Lake Formation 开发人员指南》中的构建 Amazon Data Catalog 视图

查询 Data Catalog 视图

创建 Data Catalog 视图后,您可以使用启用了 Amazon 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 子句以优化查询结果。

注意事项和限制

创建 Data Catalog 视图时,以下内容适用:

  • 只能使用 Amazon EMR 7.6 及更高版本创建 Data Catalog 视图。

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

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

  • 该表的 Amazon S3 位置必须注册为 Lake Formation 数据湖位置。如果该表未注册,则会出现错误多方言视图只能引用 Lake Formation 托管表。有关如何在 Lake Formation 中注册 Amazon S3 位置的信息,请参阅《Amazon Lake Formation 开发人员指南》中的注册 Amazon S3 位置

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

  • 在 Data Catalog 视图定义中,既不能引用其他 Amazon 账户中的表,也不能引用不同区域中同一账户中的表。

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

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

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

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

  • Amazon Glue Data Catalog 视图架构始终使用小写形式存储。例如,如果使用 DDL 语句创建包含名为 Castle 的列的 Glue Data Catalog 视图,则在 Glue Data Catalog 中创建的列将被小写为 castle。如果您随后将 DML 查询中的列名指定为 CastleCASTLE,EMR Spark 会将名称转换为小写,以便您运行查询。但是列标题会使用您在查询中指定的大小写形式显示。

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