AWS Athena开启Partition Projection后查询无返回结果问题
问题根因
无结果问题核心由建表语句中的存储格式配置不匹配导致,其余可选排查点如下:
- 存储格式配置冲突:建表时指定了
org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe作为Parquet序列化类,但INPUTFORMAT错误配置为文本文件对应的org.apache.hadoop.mapred.TextInputFormat,该输入格式无法解析Parquet类型文件,直接导致查询返回空结果。 - 列映射规则不匹配:SERDEPROPERTIES中
parquet.column.index.access设为true,该配置要求Parquet文件的列存储顺序与建表声明的id、name顺序完全一致,如果你的Parquet文件生成时列顺序不符,即使存储格式修复后也会返回空值或乱码。 - 权限校验不通过:确认执行Athena查询的IAM角色拥有
s3://bucket/subfolder/data/路径的s3:ListBucket权限,以及对应日期子路径下文件的s3:GetObject权限,权限不足也会导致查询无返回且无明确报错。
修复方案
修改建表语句中的输入输出格式为Parquet对应的类,参考修正后的建表语句如下:
create external table `test`( id int ,name string ) partitioned by ( dt string ) ROW FORMAT SERDE 'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe' WITH SERDEPROPERTIES ( 'parquet.column.index.access'='true') STORED AS INPUTFORMAT 'org.apache.hadoop.hive.ql.io.parquet.MapredParquetInputFormat' OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat' LOCATION 's3://bucket/subfolder/data/' TBLPROPERTIES ( 'classification'='parquet', 'has_encrypted_data'='false', 'transient_lastDdlTime'='1637182794', "projection.enabled"= "true", "projection.dt.type" = "date", "projection.dt.range" = "20211201,NOW", "projection.dt.format" = "yyyyMMdd", "projection.dt.interval" = "1", "projection.dt.interval.unit" = "DAYS", "storage.location.template" = "s3://bucket/subfolder/data/${dt}/" )
重建表后重新执行查询select * from test where dt = '20211201'即可正常返回结果。如果仍无数据,可以临时将parquet.column.index.access改为false验证是否为列顺序匹配问题。
内容的提问来源于stack exchange,提问作者Ganesh Chandrasekaran
相关产品推荐
相关产品推荐

