如何在Amazon Athena中获取JSON的倒数第二个键?
解决Athena中JSON路径负索引报错问题
错误原因
Athena的json_extract_scalar所用的JSON路径语法不支持负索引(如$[-1]),它基于Simba JDBC驱动的JSON路径实现,遵循的规范不包含该特性,因此直接使用负索引会触发INVALID_FUNCTION_ARGUMENT错误。
解决方案
根据你的JSON结构(数组/对象)选择对应方法:
情况1:JSON是数组,取倒数第二个元素
先通过json_array_length获取数组长度,再计算倒数第二个元素的索引(数组从0开始,索引为长度-2):
SELECT CASE WHEN json_array_length(json_column) >= 2 THEN json_extract_scalar(json_column, concat('$[', json_array_length(json_column)-2, ']')) ELSE NULL END AS second_last_element FROM table_name;
添加CASE语句是为了避免数组长度不足2时出现负索引错误。
情况2:JSON是对象,取倒数第二个键
注意:JSON对象的键在规范中是无序的,以下方法依赖Athena对键的存储排序,仅在你明确键有固定顺序时使用:
先将JSON对象转为Map,通过map_keys提取键数组,再取倒数第二个元素:
SELECT CASE WHEN cardinality(map_keys(json_parse(json_column))) >=2 THEN map_keys(json_parse(json_column))[cardinality(map_keys(json_parse(json_column)))-2] ELSE NULL END AS second_last_key FROM table_name;
验证说明
你之前使用$.status能正常查询,是因为这种明确指定键名的路径符合Athena的JSON语法规范,属于简单的对象属性访问,不存在语法兼容性问题。
内容的提问来源于stack exchange,提问作者VaibhavSka
相关产品推荐
相关产品推荐

