AWS Athena如何过滤JSON数组?JSONPath语法报错咨询
在AWS Athena中过滤JSON数组的正确方式
你遇到的问题核心是AWS Athena(基于Presto)的json_extract函数只支持有限的JSONPath语法,不支持像[?(@.key == 'color')]这种带有过滤谓词的表达式——虽然这种语法在通用JSONPath工具里是合法的,但Athena的实现没覆盖这部分功能。另外你写的路径里还有个小笔误:@.type应该是@.key(因为你的JSON对象里的键是key,不是type),不过即使改了这个,Athena还是会报错。
要在Athena里过滤JSON数组里的特定对象,你需要先把数组展开成单独的行,过滤后再按需处理,具体有两种常用方式:
1. 提取单个匹配的对象(展开后过滤)
用json_extract_array把数组提取出来,再用UNNEST展开成行,之后通过json_extract_scalar提取键值进行过滤:
SELECT element FROM UNNEST( json_extract_array('{"coll":[{"key":"color","value":"red"},{"key":"other","value":"whatever"}]}', '$.coll') ) AS t(element) WHERE json_extract_scalar(element, '$.key') = 'color';
这个查询会返回匹配的{"key":"color","value":"red"}对象。
2. 重新聚合为过滤后的JSON数组
如果需要把过滤后的结果重新组合成JSON数组,可以用array_agg结合json_format:
SELECT json_format(array_agg(element)) AS filtered_coll FROM UNNEST( json_extract_array('{"coll":[{"key":"color","value":"red"},{"key":"other","value":"whatever"}]}', '$.coll') ) AS t(element) WHERE json_extract_scalar(element, '$.key') = 'color';
这个查询会返回[{"key":"color","value":"red"}]这样的JSON数组字符串。
之所以会出现工具能运行但Athena报错的情况,是因为不同工具/数据库对JSONPath的实现差异——很多在线工具支持的是完整的JSONPath规范,但Athena的JSON函数只支持基础的路径选择(比如$.coll[0]、$.coll.key这种),不支持过滤、脚本表达式这类复杂语法。
内容的提问来源于stack exchange,提问作者Jason Dunkelberger




