Athena查询S3分区JSON数据无返回结果问题排查求助
Athena查询仅返回列头无数据问题排查方案
1. 路径配置不匹配问题修复
你当前配置存在两处路径不一致的问题,是最可能的根因:
- 建表
LOCATION参数值为s3://benchmark-files/complete/,但storage.location.template参数的前缀为s3://iceqube-benchmark-files/complete/,两个配置的bucket名称不一致,先确认数据实际存储的bucket路径,统一两个参数的前缀。 - 实际S3存储路径的分区前缀为
data1=xxx/data2=xxx/data3=xxx/data4=xxx,但storage.location.template中写的是partition_1=${partition_1}/partition_2=${partition_2}/,前缀命名和实际路径不匹配。需要将模板调整为's3://你的实际bucket/complete/data1=${partition_1}/data2=${partition_2}/data3=${partition_3}/data4=${partition_4}/',和实际S3路径的分区前缀对齐。 storage.location.template是分区投影功能的配套参数,你当前建表语句未开启分区投影,该配置不会生效。如果要使用分区投影自动识别分区,需要在TBLPROPERTIES中补全以下配置:
'projection.enabled' = 'true', 'projection.partition_1.type' = 'injected', 'projection.partition_2.type' = 'injected', 'projection.partition_3.type' = 'date', 'projection.partition_3.format' = 'yyyy-MM-dd', 'projection.partition_4.type' = 'injected'
如果不需要分区投影,可以直接删除storage.location.template配置项,避免误导。
2. 分区未加载问题排查
Athena默认不会自动识别S3上新增的分区,需要手动加载:
- 执行全量分区加载命令:
MSCK REPAIR TABLE bench_logs;,执行完成后重试查询。 - 如果全量加载异常,可以手动添加测试分区验证:
ALTER TABLE bench_logs ADD PARTITION ( partition_1='foo', partition_2='bar', partition_3='1970-01-01', partition_4='09:30:00' ) LOCATION 's3://你的实际bucket路径/data1=foo/data2=bar/data3=1970-01-01/data4=09:30:00/';
添加完成后执行查询测试即可。
3. JSON格式适配问题排查
你配置了'ignore.malformed.json' = 'true',格式不兼容的JSON会被直接过滤不返回报错,也会导致空结果:
- 确认JSON文件为单文件内每行一个独立JSON对象的格式,JsonSerDe默认不支持单JSON对象跨多行的存储格式。
- 临时将
'ignore.malformed.json'改为'false',执行查询看是否返回JSON格式错误,根据报错调整JSON结构或者建表字段定义。 - 确认建表字段名和JSON中的key完全匹配,区分大小写。如果JSON的key为大写,建表字段也需要对应为大写,或者添加SerDe配置
'case.insensitive'='false'适配。
4. 权限问题排查
确认Athena执行角色拥有对应S3路径的s3:GetObject和s3:ListBucket权限,无权限的场景下Athena也可能返回空结果而不抛出权限报错。
内容的提问来源于stack exchange,提问作者Sirwill98
相关产品推荐
相关产品推荐

