无法通过S3中的JSON文件创建可查询的Athena表,查询返回空结果
无法通过S3中的JSON文件创建可查询的Athena表,查询返回空结果
看起来你遇到的问题很常见,主要是Athena对JSON文件的格式要求和嵌套结构解析的细节导致的,我来帮你一步步排查解决:
1. 首先检查JSON文件的格式是否符合Athena的默认要求
Athena默认使用的OpenX JSON SerDe(JSON序列化/反序列化器)要求JSON文件采用JSON Lines格式——也就是每行一个完整的JSON对象,而不是像你现在这样的格式化多行结构。这种多行缩进的JSON会让SerDe无法正确识别完整的对象,最终导致查询时返回空结果。
你当前的文件格式:
{ "workflow": { "req": { "ap": { "id": 799330, "reqname": "Mimi", "manual": true, "portappid": "DTV2207241418NT00", "status": null, "createdBy": "DealerTrack_v3", "createdOn": "2024-07-22T12:19:39.017", "requestDate": "2001-02-13T19:00:00", "appno": "DTV2207241418NT00", "abc": null, "type1": "retail" } } } }
需要改成单行的JSON Lines格式:
{"workflow":{"req":{"ap":{"id":799330,"reqname":"Mimi","manual":true,"portappid":"DTV2207241418NT00","status":null,"createdBy":"DealerTrack_v3","createdOn":"2024-07-22T12:19:39.017","requestDate":"2001-02-13T19:00:00","appno":"DTV2207241418NT00","abc":null,"type1":"retail"}}}}
修改后重新运行Crawler,或者直接刷新表的分区,再查询应该就能看到数据了。
2. 如果无法修改JSON文件,调整表的SerDe配置
要是你没办法修改S3里的JSON文件格式,可以通过修改表的属性,让OpenX JSON SerDe支持多行JSON解析:
ALTER TABLE new1_json SET TBLPROPERTIES ( 'openx.serde.parse.multi.line.json' = 'true', 'serialization.format' = '1' );
执行这条语句后,重新查询表,应该就能正确读取多行格式的JSON了。
3. 确认查询方式是否正确
即使表结构正确,直接使用SELECT * FROM new1_json可能会因为嵌套结构的显示问题让你误以为结果是空的——Athena会把struct类型显示为类似{...}的格式,但不会展开内容。你可以尝试直接查询嵌套字段来验证数据是否存在:
SELECT workflow.req.ap.id, workflow.req.ap.reqname, workflow.req.ap.createdBy FROM new1_json
如果数据被正确读取,这条查询会返回对应的字段值。
4. 检查Crawler的配置细节
- 确保Crawler的数据源指向的是包含该JSON文件的S3路径(而不是单个文件,虽然单个文件也能工作,但路径方式更可靠);
- 检查Crawler使用的分类器:默认的JSON分类器是针对JSON Lines格式的,如果你的文件是多行的,可能需要自定义一个支持多行JSON的分类器,或者直接用上面的SerDe配置调整来解决。
备注:内容来源于stack exchange,提问作者Beginner
相关产品推荐
相关产品推荐

