Databricks SQL中JSONPath通配符匹配cpe_match结果缺失问题
Databricks SQL中JSONPath匹配所有cpe_match节点的问题分析与解决
问题原因
你遇到的结果差异来自两处操作错误:
错误调用
to_json()函数
若nodes字段本身是可解析的JSON类型(比如Databricks中的ARRAY<STRUCT>、STRUCT,或已通过from_json解析的JSON字符串),to_json(nodes)会将其转换为JSON格式的字符串。此时用:[]语法访问,相当于对文本字符串而非JSON对象执行查询,自然无法正确提取目标节点。JSONPath表达式未覆盖嵌套层级
你提到的标准JSONPath$.[*].cpe_match仅能匹配顶层数组元素的cpe_match节点(即示例中的空数组),无法获取children嵌套层级里的cpe_match。你说能找到3个匹配项,实际是使用了递归表达式$..cpe_match(双点表示递归遍历所有层级),而你在Databricks SQL中写的:[*].cpe_match仅处理了顶层节点,未递归查找子层级。
解决方法
1. 移除不必要的to_json()
直接使用原始的nodes字段(若nodes是存储的JSON字符串,需先通过from_json解析为JSON类型)。
2. 使用递归JSONPath表达式
要匹配所有层级的cpe_match节点,在Databricks SQL中使用..递归操作符:
修正后的查询:
select nodes:..cpe_match from cve_raw
优化:提取非空的cpe_match对象
如果只需要非空的cpe_match内容,可以结合flatten和filter处理结果:
select filter(flatten(nodes:..cpe_match), x -> size(x) > 0) from cve_raw
针对你的示例JSON,这个查询会返回包含两个有效cpe_match对象的数组。
内容的提问来源于stack exchange,提问作者Neil P
相关产品推荐
相关产品推荐

