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

使用视图

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

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

何时使用视图?

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

  • 查询数据子集。例如,您可以根据原始表创建一个包含列子集的视图,以简化查询数据。

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

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

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

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

Athena 中受支持的视图操作

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

语句 描述
CREATE VIEW

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

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

DESCRIBE VIEW

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

DROP VIEW

删除现有视图。如果该视图不存在,可选 IF EXISTS 子句将抑制错误出现。

SHOW CREATE VIEW

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

SHOW VIEWS

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

SHOW COLUMNS

列出视图的架构中的列。

视图注意事项

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

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

  • 如果您在通过 Amazon Glue Data 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 中表级精细访问控制来限制对这些视图的访问

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

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

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

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

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

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

视图限制

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

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

  • 您不能将 Athena 中创建的视图与外部 Hive 元存储或 UDF 结合使用。有关使用在 Hive 外部创建的视图的信息,请参阅 使用 Hive 视图

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

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

  • 虽然 Athena 引擎版本 2 和 Athena 引擎版本 3 都支持跨账户查询视图,但您无法创建包含跨账户 Amazon Glue Data Catalog 的视图。有关访问跨账户数据目录的信息,请参阅 授予 Amazon Glue 数据目录跨账户访问权限

  • Athena 视图不支持 Hive 或 Iceberg 隐藏的元数据列 $bucket$file_modified_time$file_size$partition。有关在 Athena 中使用 $path 元数据列的信息,请参阅 获取 Amazon S3 中源数据的文件位置

在控制台中使用视图

在 Athena 控制台中,您可以:

  • 在列出表的左窗格中找到所有视图。

  • 筛选视图。

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

显示视图的操作

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

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

  2. 选择视图旁边的三个竖直的点,以显示视图的操作列表。

    视图的操作菜单。
  3. 选择操作以预览视图、将视图名称插入查询编辑器、删除视图、查看视图属性,或在查询编辑器中显示并编辑视图。

创建视图

您可以通过使用模板或运行现有查询以在 Athena 控制台中创建视图。

使用模板创建视图
  1. 在 Athena 控制台中,选择 Tables and views(表和视图)旁边的 Create(创建),然后选择 Create view(创建视图)。

    创建视图。

    此操作会将可编辑的视图模板放入查询编辑器中。

  2. 根据您的要求编辑视图模板。在语句中输入视图的名称时,请记住,视图名称不能包含除下划线 ((_)) 以外的特殊字符。请参阅 表、数据库和列的名称。避免使用保留关键字来命名视图。

    有关创建视图的更多信息,请参阅 CREATE VIEW视图示例

  3. 选择 Run(运行)以创建视图。该视图将显示在 Athena 控制台中的视图列表中。

通过现有查询创建视图
  1. 使用 Athena 查询编辑器运行现有查询。

  2. 在查询编辑器窗口下,选择 Create(创建),然后选择 View from query(通过查询查看)。

    选择 Create(创建),View from query(通过查询查看)。
  3. Create View(创建视图)对话框中,输入视图名称并选择 Create(创建)。视图名称不能包含除下划线 (_) 以外的特殊字符。请参阅 表、数据库和列的名称。避免使用保留关键字来命名视图。

    Athena 将视图添加到控制台的视图列表中,并显示查询编辑器中视图的 CREATE VIEW 语句。

注意事项
  • 如果删除了作为其他表的依据的表,并且尝试运行该视图,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 the_max FROM x GROUP BY a ), table2 AS ( SELECT a, AVG(d) AS the_avg FROM y GROUP BY a) SELECT table1.a, table1.the_max, table2.the_avg FROM table1 JOIN table2 ON table1.a = table2.a;

有关查询联合视图的信息,请参阅 查询联合视图