启用分区投影后AWS Athena无法读取Glue表数据的排查求助
问题排查与解决方案
核心问题
你的分区投影配置生成的分区值格式与S3实际存储路径不匹配:
- S3路径中
month和day是两位带前导零的格式(如month=04、day=03) - 当前配置的
integer类型分区投影默认生成不带前导零的数值(如4、3),导致Athena无法匹配到对应数据路径,因此返回空结果且无数据扫描。
修复步骤
修改CloudFormation模板中Glue表的Parameters部分,为month和day添加格式化参数,确保投影生成的分区值与S3路径格式一致:
MyGlueTable: Type: AWS::Glue::Table Properties: CatalogId: !Ref AWS::AccountId DatabaseName: ${self:custom.glueDB} TableInput: Name: reporting-${self:provider.stage} Description: Table for reporting data TableType: EXTERNAL_TABLE Parameters: classification: "parquet" projection.enabled: true projection.year.type: "integer" projection.year.range: 2025, 2030 projection.month.type: "integer" projection.month.range: 1, 12 projection.month.format: "02" # 新增:强制生成两位带前导零的月份 projection.day.type: "integer" projection.day.range: 1, 31 projection.day.format: "02" # 新增:强制生成两位带前导零的日期 StorageDescriptor: Location: "s3://my-bucket/reporting/" InputFormat: org.apache.hadoop.hive.ql.io.parquet.MapredParquetInputFormat OutputFormat: org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat SerdeInfo: SerializationLibrary: org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe Columns: - Name: someColumn Type: string PartitionKeys: - Name: year Type: int - Name: month Type: int - Name: day Type: int
关键注意事项
- 启用分区投影后,无需再执行
MSCK REPAIR TABLE命令,Athena会通过投影规则自动识别符合格式的分区路径。 - 确认
projection.<column>.format参数值:"02"表示将整数格式化为两位数字,不足两位时补前导零,完全匹配S3路径中的month=04、day=03格式。 - 更新CloudFormation模板后,重新部署栈以应用配置变更,随后即可通过Athena正常查询数据。
内容的提问来源于stack exchange,提问作者Raisin
相关产品推荐
相关产品推荐

