You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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文件的实际数据内容来执行过滤逻辑,具体原因包括:

  1. 执行计划差异:带非分区过滤时触发ScanFilterProject操作,这个过程需要:

    • 先读取文件的Parquet footer元数据,确认字段结构和统计信息
    • 再读取文件的具体数据块,筛选符合effective_time_start条件的记录
    • 加上Athena的并行处理机制,不同任务分片可能会重复访问同一文件的不同部分,导致多次GET请求
  2. 仅分区过滤时的优化:仅用分区字段过滤时,Athena可直接通过分区投影定位目标分区,无需读取文件实际数据,仅需读取文件元数据获取$path,因此每个文件仅触发1次GET请求。

  3. Parquet统计信息缺失(可能因素):如果Parquet文件未生成或Athena未识别到effective_time_start字段的min/max统计信息,Athena无法提前跳过不符合条件的文件,必须完整读取内容执行过滤,进一步增加GET请求次数。


内容的提问来源于stack exchange,提问作者onler

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 23:21:04