为何Athena查询非分区字段时会重复调用同一S3文件?
Athena添加非分区字段过滤时重复调用S3文件的原因
环境与配置信息
存储桶结构
bucket-name/node=[A-Z0-9]{4}/date={yyyy}-{MM}-{dd}/{uuid}.parquet
示例:
bucket-name/node=NODE/date=2023-10-10/123.parquet
Glue表结构
[ { "Name": "data", "Type": "string" }, { "Name": "effective_time_start", "Type": "bigint" }, { "Name": "node", "Type": "string", "PartitionKey": "Partition (0)" }, { "Name": "date", "Type": "date", "PartitionKey": "Partition (1)" } ]
Glue表属性
has_encrypted_data: false projection.date.type: date projection.date.format: yyyy-MM-dd projection.date.range: 2023-01-01,2024-12-31 projection.node.type: injected classification: parquet projection.enabled: true
Glue表详情
Input format: org.apache.hadoop.hive.ql.io.parquet.MapredParquetInputFormat Output format: org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat Serialization lib: org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe
S3文件示例
bucket-name/node=NOD1/date=2023-10-10/FILE1.parquet bucket-name/node=NOD1/date=2023-10-10/FILE2.parquet bucket-name/node=NOD1/date=2023-10-11/FILE3.parquet bucket-name/node=NOD1/date=2023-10-11/FILE4.parquet bucket-name/node=NOD1/date=2023-10-12/FILE5.parquet ...
两次查询对比
第一次查询(带非分区字段过滤)
SQL语句:
SELECT "$path" AS s3url FROM "my_table" WHERE node = 'NOD1' AND date >= DATE('2023-10-10') AND date <= DATE('2023-10-11') AND effective_time_start >= 1696910400000
执行情况:
- 执行计划显示使用
ScanFilterProject操作 - S3日志:每个日期分区1次LIST请求(共2次),查询区间内每个文件被调用4次GET请求(共16次)
第二次查询(仅分区字段过滤)
SQL语句:
SELECT "$path" AS s3url FROM "my_table" WHERE node = 'NOD1' AND date >= DATE('2023-10-10') AND date <= DATE('2023-10-11')
执行情况:
- 执行计划显示使用
TableScan操作 - S3日志:每个日期分区1次LIST请求(共2次),每个文件仅1次GET请求(共4次)
原因分析
当查询包含非分区字段effective_time_start的过滤条件时,Athena无法仅通过分区投影和元数据完成数据筛选,必须读取Parquet文件的实际数据内容来执行过滤逻辑,具体原因包括:
执行计划差异:带非分区过滤时触发
ScanFilterProject操作,这个过程需要:- 先读取文件的Parquet footer元数据,确认字段结构和统计信息
- 再读取文件的具体数据块,筛选符合
effective_time_start条件的记录 - 加上Athena的并行处理机制,不同任务分片可能会重复访问同一文件的不同部分,导致多次GET请求
仅分区过滤时的优化:仅用分区字段过滤时,Athena可直接通过分区投影定位目标分区,无需读取文件实际数据,仅需读取文件元数据获取
$path,因此每个文件仅触发1次GET请求。Parquet统计信息缺失(可能因素):如果Parquet文件未生成或Athena未识别到
effective_time_start字段的min/max统计信息,Athena无法提前跳过不符合条件的文件,必须完整读取内容执行过滤,进一步增加GET请求次数。
内容的提问来源于stack exchange,提问作者onler
相关产品推荐
相关产品推荐

