查询受管表 - Amazon Athena
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

查询受管表

要查询受管数据集,请使用标准 SELECT 语句,如下所示。

SELECT * FROM databasename.tablename [WHERE predicate]

谓词下推支持

为了优化查询时间,有些谓词会下推到数据所在的位置。下表总结了谓词下推中当前支持的 Athena 数据类型和逻辑运算符。

Athena 数据类型 下推
array
bigint
binary
boolean
char
date
decimal
double
float
int, integer
map
smallint
string
struct
timestamp
tinyint
varchar
逻辑运算符 示例查询 下推
单个或多个 AND SELECT * FROM table WHERE col_1 = a AND col_2 = b
同一列上的 OR 条件 SELECT * FROM table WHERE col_1 = a OR col_1 = b
不同列上的 OR 条件 SELECT * FROM table WHERE col_1 = a OR col_2 = b
IS NULL, IS NOT NULL SELECT * FROM table WHERE col_1 IS NOT NULL
NOT SELECT * FROM table WHERE NOT col_1 = a
IN SELECT * FROM table WHERE NOT col_1 IN (a, b)
BETWEEN SELECT * FROM table WHERE col_1 BETWEEN A AND B
LIKE SELECT * FROM table WHERE col_1 LIKE 'expression%'

时间旅行和版本旅行查询

每个受管表都维护所包含 Amazon S3 对象的版本控制清单。清单的早期版本可用于时间旅行和版本旅行查询。

Athena 中的时间旅行查询在 Amazon S3 中查询一致快照中截至指定日期和时间的历史数据。Athena 中的版本旅行查询在 Amazon S3 中查询指定快照 ID 以前的历史数据。

时间旅行查询

要运行时间旅行查询,请在 SELECT 语句中的表名称之后使用 FOR SYSTEM_TIME AS OF timestamp,如以下示例所示。

SELECT * FROM database.table FOR SYSTEM_TIME AS OF timestamp

为旅行指定的系统时间可以是时间戳,也可以是带时区的时间戳。如果未指定,Athena 将该值视为以 UTC 时间表示的时间戳。

以下示例时间旅行查询选择指定日期和时间的数据。

SELECT * FROM governed_table FOR SYSTEM_TIME AS OF TIMESTAMP '2020-01-01 10:00:00'
SELECT * FROM governed_table FOR SYSTEM_TIME AS OF (current_timestamp - interval '1' day)

版本旅行查询

要执行版本旅行查询(即,查看截至指定版本的一致快照),请在 SELECT 语句中的表名称之后使用 FOR SYSTEM_VERSION AS OF version,如以下示例所示。

SELECT * FROM database.table FOR SYSTEM_VERSION AS OF version

version 参数是与受管表版本关联的 bigint 快照 ID。

以下示例版本旅行查询选择指定版本的数据。

SELECT * FROM governed_table FOR SYSTEM_VERSION AS OF 949530903748831860

结合使用时间旅行和版本旅行

您可以在同一查询中使用时间旅行和版本旅行语法来指定不同的时间和版本控制条件,如以下示例所示。

SELECT table1.*, table2.* FROM governed_table FOR SYSTEM_TIME AS OF (current_timestamp - interval '1' day) AS table1 FULL JOIN governed_table FOR SYSTEM_VERSION AS OF 5487432386996890161 AS table2 ON table1.ts = table2.ts WHERE (table1.id IS NULL OR table2.id IS NULL)