雅典娜(Hive / Presto)查询分区表IN语句

时间:2020-08-12 14:48:58

标签: hive partitioning presto amazon-athena

我在雅典娜(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条件下进行转换,因此这仍然是一个查询,它将受益于分区。我说得对吗?

2 个答案:

答案 0 :(得分:1)

是的,在documentation中也有提及。

Athena在分区表上运行查询时,它将检查查询的WHERE子句中是否使用了任何分区列。如果使用分区列,则Athena请求AWS Glue数据目录返回与指定分区列匹配的分区规范。分区规范包括LOCATION属性,该属性告诉Athena在读取数据时使用哪个Amazon S3前缀。在这种情况下,仅扫描存储在此前缀中的数据。如果您未在WHERE子句中使用分区列,则Athena会扫描属于该表分区的所有文件。

答案 1 :(得分:1)

不幸的是,雅典娜没有公开会使您更容易理解如何优化查询的信息。当前,您唯一可以做的就是运行各种查询变体,并查看GetQueryExecution API调用中返回的统计信息。

弄清楚Athena是否在查询中使用分区的一种方法是使用分区列的不同值运行查询,并确保扫描的数据量不同。如果数据量不同,则雅典娜(Athena)可以在查询计划期间修剪分区。