使用视图
在 Amazon Athena 中,视图是逻辑表,而非物理表。每次在查询中引用视图时,定义该视图的查询都会运行。
您可以从 SELECT
查询创建视图,然后在未来的查询中引用该视图。有关更多信息,请参阅CREATE VIEW。
何时使用视图?
您可能希望创建视图以达到以下目的:
-
查询数据子集。例如,您可以根据原始表创建一个包含列子集的视图,以简化查询数据。
-
将多个表合并在一个查询中。如果您有多个表,希望使用
UNION ALL
将它们组合起来,可以创建一个视图,利用表达式简化针对组合表的查询。 -
隐藏现有基本查询的复杂性和简化用户运行的查询。基本查询通常包括表之间的联接、列列表中的表达式和其他 SQL 语法,这使理解和调试查询变得困难。您可以创建一个能够隐藏复杂性和简化查询的视图。
-
试验优化方法和创建优化查询。例如,如果您发现某种
WHERE
条件、JOIN
命令或其他表达式的组合能带来最佳性能,则可以使用这些子句和表达式创建一个视图。应用程序然后可以针对此视图执行相对简单的查询。如果后来您又发现更好的优化原始查询的办法,则当您重新创建视图时,所有应用程序会立即利用优化的基本查询。 -
隐藏底层表和列名称,并最大程度减少维护问题(如果这些列名称改变)。在这种情况下,您使用新名称重新创建视图。使用该视图而非底层表的所有查询保持运行,无需更改。
Athena 中受支持的视图操作
Athena 支持下列视图操作。您可以在查询编辑器中运行这些命令。
Statement | 描述 |
---|---|
CREATE VIEW |
从指定的 可选的 |
DESCRIBE VIEW |
显示命名视图的列列表。这能让您检查复杂视图的属性。 |
DROP VIEW |
删除现有视图。如果该视图不存在,可选 |
SHOW CREATE VIEW |
显示创建指定视图的 SQL 语句。 |
SHOW VIEWS |
列出指定数据库或当前数据库(如果省略数据库的名称)中的视图。将可选 |
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 控制台中,您可以:
-
在列出表的左窗格中找到所有视图。
-
筛选视图。
-
预览视图、显示其属性、编辑或删除视图。
显示视图的操作
只有创建了视图后,该视图才会出现在控制台中。
-
在 Athena 控制台中,选择 Views(视图),然后选择一个视图,展开它并显示视图中的列。
-
选择视图旁边的三个竖直的点,以显示视图的操作列表。
-
选择操作以预览视图、将视图名称插入查询编辑器、删除视图、查看视图属性,或在查询编辑器中显示并编辑视图。
创建视图
您可以通过使用模板或运行现有查询以在 Athena 控制台中创建视图。
使用模板创建视图
-
在 Athena 控制台中,选择 Tables and views(表和视图)旁边的 Create(创建),然后选择 Create view(创建视图)。
此操作会将可编辑的视图模板放入查询编辑器中。
-
根据您的要求编辑视图模板。在语句中输入视图的名称时,请记住,视图名称不能包含除下划线 (
(_)
) 以外的特殊字符。请参阅表、数据库和列的名称。避免使用保留关键字来命名视图。有关创建视图的更多信息,请参阅 CREATE VIEW 和 视图示例。
-
选择 Run(运行)以创建视图。该视图将显示在 Athena 控制台中的视图列表中。
通过现有查询创建视图
-
使用 Athena 查询编辑器运行现有查询。
-
在查询编辑器窗口下,选择 Create(创建),然后选择 View from query(通过查询查看)。
-
在 Create View(创建视图)对话框中,输入视图名称并选择 Create(创建)。视图名称不能包含除下划线
(_)
以外的特殊字符。请参阅表、数据库和列的名称。避免使用保留关键字来命名视图。Athena 将视图添加到控制台的视图列表中,并显示查询编辑器中视图的
CREATE VIEW
语句。
注意
-
如果删除了作为其他表的依据的表,并且尝试运行该视图,Athena 将显示一条错误消息。
-
可以创建一个嵌套视图,即在现有视图之上的视图。Athena 可防止您运行引用自身的递归视图。
视图示例
要显示视图查询的语法,请使用 SHOW CREATE VIEW。
例 示例 1
请考虑以下两个表:表 employees
,具有两列,分别是 id
和 name
,以及表 salaries
,也具有两列,分别是 id
和 salary
。
在本示例中,我们创建名为 name_salary
的视图作为 SELECT
查询,该查询将获得一个 ID 列表,这些 ID 映射到来自表 employees
和 salaries
的薪水:
CREATE VIEW name_salary AS SELECT employees.name, salaries.salary FROM employees, salaries WHERE employees.id = salaries.id
例 示例 2
在以下示例中,我们创建一个名为 view1
的视图,以使您能够隐藏较复杂的查询语法。
该视图运行在两个表,即 table1
和 table2
上,其中每个表都是不同的 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;
有关查询联合视图的信息,请参阅 查询联合视图。