使用视图 - Amazon Athena
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

如果我们为英文版本指南提供翻译,那么如果存在任何冲突,将以英文版本指南为准。在提供翻译时使用机器翻译。

使用视图

在 Amazon Athena 中,视图是逻辑表,而非物理表。每次在查询中引用视图时,定义该视图的查询都会运行。

您可以从 SELECT 查询创建视图,然后在未来的查询中引用该视图。有关更多信息,请参阅 CREATE VIEW。)

何时使用视图?

您可能希望创建视图以达到以下目的:

  • 查询数据子集。例如,您可以使用原始表子的列子集创建视图,以简化查询数据。

  • 将多个表合并在一个查询中。如果您有多个表,希望使用 UNION ALL 将它们组合起来,可以创建一个视图,利用表达式简化针对组合表的查询。

  • 隐藏现有基本查询的复杂性和简化用户运行的查询。基本查询通常包括表之间的联接、列列表中的表达式和其他 SQL 语法,这使理解和调试查询变得困难。您可以创建一个能够隐藏复杂性和简化查询的视图。

  • 试验优化方法和创建优化查询。例如,如果您发现某种 WHERE 条件、JOIN 命令或其他表达式的组合能带来最佳性能,则可以使用这些子句和表达式创建一个视图。应用程序然后可以针对此视图执行相对简单的查询。如果后来您又发现更好的优化原始查询的办法,则当您重新创建视图时,所有应用程序会立即利用优化的基本查询。

  • 隐藏底层表和列名称,并最大程度减少维护问题(如果这些列名称改变)。在这种情况下,您使用新名称重新创建视图。使用该视图而非底层表的所有查询保持运行,无需更改。

Athena 中受支持的视图操作

Athena 支持下列视图操作。您可以在查询编辑器中运行这些命令。

Statement Description
CREATE VIEW

从指定的 SELECT 查询创建新视图。有关更多信息,请参阅 创建视图。)

可选的 OR REPLACE 子句允许您通过替换来更新现有视图。

DESCRIBE VIEW

显示命名视图的列列表。这能让您检查复杂视图的属性。

DROP VIEW

删除现有视图。如果该视图不存在,可选 IF EXISTS 子句将抑制错误出现。有关更多信息,请参阅 删除视图。)

SHOW CREATE VIEW

显示创建指定视图的 SQL 语句。

SHOW VIEWS

列出指定数据库或当前数据库(如果省略数据库的名称)中的视图。将可选 LIKE 子句与一个正则表达式结合使用来限制视图名称列表。您还可以在控制台的左窗格中看到视图列表。

SHOW COLUMNS

列出视图的架构中的列。

视图注意事项

以下注意事项适用于在 Athena 中创建和使用视图:

  • 在 Athena 中,您可以预览和使用在 Athena 控制台、AWS Glue 数据目录(如果您已迁移并使用它)中或通过运行于连接到同一目录的 Amazon EMR 集群上的 Presto 创建的视图。不能预览或添加以其他方式创建的 Athena 视图。

  • 如果您正在通过 AWS GlueData Catalog,您必须包括 PartitionKeys 参数并将其值设置为空白列表,如下所示: "PartitionKeys":[]。否则,您的视图查询将失败 Athena. 以下示例显示使用 "PartitionKeys":[] 从 Data Catalog创建的视图。

    aws glue create-table --database-name mydb --table-input '{ "Name":"test", "TableType": "EXTERNAL_TABLE", "Owner": "hadoop", "StorageDescriptor":{ "Columns":[{ "Name":"a","Type":"string"},{"Name":"b","Type":"string"}], "Location":"s3://xxxxx/Oct2018/25Oct2018/", "InputFormat":"org.apache.hadoop.mapred.TextInputFormat", "OutputFormat": "org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat", "SerdeInfo":{"SerializationLibrary":"org.apache.hadoop.hive.serde2.OpenCSVSerde", "Parameters":{"separatorChar": "|", "serialization.format": "1"}}},"PartitionKeys":[]}'
  • 如果您已在 Data Catalog 中创建了 Athena 视图,则 Data Catalog 将视图视为表。您可以使用在 Data Catalog 中表级精细访问控制来限制对这些视图的访问。

  • Athena 可防止您运行递归视图,如有运行,则会显示错误消息。递归视图是引用自身的视图查询。

  • Athena 在检测到过时视图时会显示错误消息。发生以下一种情况时,会报告过时的视图:

    • 视图引用了不存在的表或数据库。

    • 在引用的表中进行了架构或元数据更改。

    • 删除了引用的表并使用不同的架构或配置重新创建。

  • 您可以创建并运行嵌套视图,只要嵌套视图背后的查询有效以及表和数据库存在。

视图限制

  • Athena 视图名称不能包含特殊字符,除下划线外 (_)。有关详细信息,请参阅 表、数据库和列的名称.

  • 避免使用保留关键字来命名视图。如果使用保留关键字,请在视图查询中使用双引号将保留关键字括起来。请参阅保留关键字

  • 您不能将视图与联合数据源、外部 Hive 元存储或 UDF 结合使用。

  • 您不能将视图与地理空间函数结合使用。

  • 您不能使用视图来管理对 Amazon S3 中数据的访问控制。要查询视图,您需要相应权限才能访问存储在 Amazon S3 中的数据。有关更多信息,请参阅 对 Amazon S3 的访问权限。)

在控制台中使用视图

在 Athena 控制台中,您可以:

  • 在列出表的左窗格中查找所有视图。Athena 运行 SHOW VIEWS 操作来显示此列表。

  • 筛选视图。

  • 预览视图、显示其属性、编辑或删除视图。

在控制台中列出视图操作

只有创建了视图后,该视图才会出现在控制台中。

  1. 在 Athena 控制台中,选择 Views (视图),选择一个视图,然后展开它。

    该视图显示其内容,包括所包含的列,如以下示例所示:

    
                        显示列的扩展视图的屏幕快照。
  2. 在视图列表中,选择一个视图,然后打开上下文(右键单击)菜单。操作菜单图标 (⋮) 针对您选择的视图突出显示,同时,操作列表打开,如以下示例所示:

    
                        视图的上下文菜单的屏幕快照。它允许您预览、显示属性、编辑和删除视图。
  3. 选择一个选项:例如,Show properties (显示属性) 将显示视图名称、Athena 中在其中创建了视图表的数据库名称以及创建视图时的时间戳:

创建视图

可以从任何 SELECT 查询创建视图。

在控制台中创建视图

要创建视图,请先选择一个数据库,然后选择一个表。对表运行 SELECT 查询,然后从查询创建视图。

  1. 在 Athena 控制台中,选择 Create view (创建视图)

    
                        显示用于创建视图的按钮的屏幕快照。

    在查询编辑器中,将显示一个视图查询示例。

  2. 编辑视图查询示例。指定表名称并添加其他语法。有关更多信息,请参阅 CREATE VIEW视图示例

    视图名称不能包含特殊字符,除下划线外 (_)。参见 表、数据库和列的名称. 避免使用保留关键字来命名视图。

  3. 运行视图查询,根据需要进行调试,然后保存。

或者,在查询编辑器中创建查询,然后使用 Create view from query (从查询创建视图)


                显示用于从查询创建视图的按钮的屏幕快照。

如果您运行的视图无效,则 Athena 会显示一条错误消息。

如果删除了创建视图所基于的表,则当您尝试运行该视图时,Athena 将显示一条错误消息。

可以创建一个嵌套视图,即在现有视图之上的视图。Athena 可防止您运行引用自身的递归视图。

视图示例

要显示视图查询的语法,请使用 SHOW CREATE VIEW

例 示例 #1

请考虑以下两个表:表 employees,具有两列,分别是 idname,以及表 salaries,也具有两列,分别是 idsalary

在本示例中,我们创建名为 name_salary 的视图作为 SELECT 查询,该查询将获得一个 ID 列表,这些 ID 映射到来自表 employeessalaries 的薪水:

CREATE VIEW name_salary AS SELECT employees.name, salaries.salary FROM employees, salaries WHERE employees.id = salaries.id

例 示例 2

在以下示例中,我们创建一个名为 view1 的视图,以使您能够隐藏较复杂的查询语法。

该视图运行在两个表,即 table1table2 上,其中每个表都是不同的 SELECT 查询。视图选择所有列 table1 并与 table2...联接基于列 a 同时存在于两个表中。

CREATE VIEW view1 AS WITH table1 AS ( SELECT a, MAX(b) AS b FROM x GROUP BY a ), table2 AS ( SELECT a, AVG(d) AS d FROM y GROUP BY a) SELECT table1.*, table2.* FROM table1 JOIN table2 ON table1.a = table2.a;

更新视图

创建了一个视图后,它会出现在左窗格中的 Views (视图) 列表中。

要编辑该视图,请选择它,选择上下文(右键单击)菜单,然后选择 Show/edit query (显示/编辑查询)。也可以在查询编辑器中编辑视图。有关更多信息,请参阅 CREATE VIEW。)

删除视图

要删除一个视图,请选择它,选择上下文(右键单击)菜单,然后选择 Delete view (删除视图)。有关更多信息,请参阅 DROP VIEW。)