You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动