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

问题描述

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

解决方法

是的,在documentation中也有提及。

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

,

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

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

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...