Glue爬虫识别S3 JSON后Athena查询结果异常求助
Glue爬虫识别JSON数组后Athena查询数据合并一行的解决办法
1. 先统一JSON文件格式
如果你的JSON是整个文件一个大数组(比如[{"a":1},{"a":2}]),优先改成JSON Lines格式:每行一个独立的JSON对象,示例如下:
{"id":1,"name":"foo"} {"id":2,"name":"bar"}
这种格式是Glue和Athena最兼容的结构,能避免绝大多数解析异常。
2. 修正Glue爬虫与表配置
- 要是必须保留数组格式,确保Classifier的JSON Path设为
$[*],同时在爬虫设置里开启检测嵌套列。 - 检查爬虫生成的表:
- 确认
InputFormat是org.apache.hadoop.mapred.TextInputFormat OutputFormat是org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat
这两个是正确解析JSON的基础配置,要是不对,手动在Glue控制台修改表属性。
- 确认
3. 替换Athena表的SerDe
默认的SerDe对数组结构支持不好,换成OpenX的JSON SerDe,执行以下SQL:
ALTER TABLE your_table_name SET SERDE 'org.openx.data.jsonserde.JsonSerDe' WITH SERDEPROPERTIES ( "dots.in.keys" = "true", "ignore.malformed.json" = "true" );
如果是整个文件一个数组的情况,再加一行表属性配置,让Athena展开数组:
ALTER TABLE your_table_name SET TBLPROPERTIES ("json.path" = "$[*]");
4. 重新爬取验证
删掉之前生成的旧表,重新运行爬虫,之后在Athena执行SELECT * FROM your_table_name LIMIT 5,检查每条数组元素是否都变成了单独的行。
避坑提醒
- 同一个S3路径下别混放不同结构的JSON,爬虫会乱识别结构。
- 检查S3文件权限:Glue爬虫和Athena的执行角色必须具备读权限。
- 嵌套结构要确认爬虫识别完整,不然查询会丢失数据。
内容的提问来源于stack exchange,提问作者Ismael Heinen
相关产品推荐
相关产品推荐

