我在雅典娜(HIVE / Presto)中具有以下分区表:
CREATE EXTERNAL TABLE IF NOT EXISTS mydb.mytable (
id STRING,
data STRING
)
PARTITIONED BY (
year string,
month string,
day string
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\t'
LINES TERMINATED BY '\n'
LOCATION 's3://mybucket';
数据存储在以s3://mybucket/year=2020/month=01/day=30/
之类的路径结构组织的s3中。
我想知道以下查询是否会利用分区优化:
SELECT
*
FROM
mydb.mytable
WHERE
(year='2020' AND month='08' AND day IN ('10', '11', '12')) OR
(year='2020' AND month='07' AND day IN ('29', '30', '31'));
我假设由于IN
运算符将在一系列OR
条件下进行转换,因此这仍然是一个查询,它将受益于分区。我说得对吗?
答案 0 :(得分:1)
是的,在documentation中也有提及。
Athena在分区表上运行查询时,它将检查查询的WHERE子句中是否使用了任何分区列。如果使用分区列,则Athena请求AWS Glue数据目录返回与指定分区列匹配的分区规范。分区规范包括LOCATION属性,该属性告诉Athena在读取数据时使用哪个Amazon S3前缀。在这种情况下,仅扫描存储在此前缀中的数据。如果您未在WHERE子句中使用分区列,则Athena会扫描属于该表分区的所有文件。
答案 1 :(得分:1)
不幸的是,雅典娜没有公开会使您更容易理解如何优化查询的信息。当前,您唯一可以做的就是运行各种查询变体,并查看GetQueryExecution
API调用中返回的统计信息。
弄清楚Athena是否在查询中使用分区的一种方法是使用分区列的不同值运行查询,并确保扫描的数据量不同。如果数据量不同,则雅典娜(Athena)可以在查询计划期间修剪分区。