AWS Athena查询成功但返回所有字段为空,求助排查原因
字段名大小写不匹配
Parquet列名是大小写敏感的,如果Glue表定义的字段名(比如userid)和Parquet文件实际列名(比如UserId)大小写不一致,Athena会因为匹配失败返回空值,而S3 Select可能在查询时用了正确的大小写所以正常。
排查:执行DESCRIBE FORMATTED <你的表名>查看Glue表字段定义,和在线查看器里的Parquet列名逐一对比,确保完全一致。压缩格式与表配置不匹配
如果Parquet文件使用了特定压缩算法(如Snappy、Gzip),但Glue表的输入格式、SerDe库配置错误,Athena无法正确解析字段内容,但能识别文件的记录数。
排查:检查Glue表的属性:- 确认
InputFormat为org.apache.hadoop.hive.ql.io.parquet.MapredParquetInputFormat OutputFormat为org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormatSerde Library为org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe- 查看
TBLPROPERTIES中的parquet.compression参数,是否和文件实际压缩格式一致。
- 确认
字段数据类型不匹配
Glue表定义的字段类型和Parquet文件实际类型不匹配时,Athena无法正确解析值,返回空。比如Parquet里的int64类型被定义成string,或者嵌套结构被定义为普通字段。
排查:对比在线查看器显示的Parquet字段类型和Glue表的字段类型,确保一一对应(如Parquet的BOOLEAN对应Glue的boolean,INT32对应int,嵌套结构对应struct)。目录下存在干扰文件
如果Glue表位置指向的目录中除了目标Parquet文件,还有临时文件、零字节文件等不符合格式的文件,Athena扫描时可能读取这些文件,导致部分或全部字段值为空(但记录数会包含所有文件的记录)。
排查:确认Glue表Location路径下只有目标Parquet文件;或在Athena查询时指定具体文件路径过滤:
SELECT * FROM <你的表名> WHERE "$path" = 's3://你的存储桶路径/目标文件.parquet'
- SerDe参数配置异常
自定义的SerDe参数可能导致解析失败,比如错误设置了parquet.column.index.access等参数,或者serialization.format配置错误。
排查:查看Glue表的TBLPROPERTIES,移除异常的自定义参数,重置为默认的Parquet SerDe配置。
内容的提问来源于stack exchange,提问作者DJR999

