You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

BigQuery无JSONPath递归运算符..时如何实现JSON对象递归搜索

BigQuery 无JSONPath递归运算符时的递归提取方案

BigQuery 原生JSONPath语法目前不支持递归下降运算符..,可以通过以下两种方案实现无需指定上层键名提取目标字段的需求。

方案1:使用自定义JS UDF实现递归搜索(推荐,兼容性最强)

通过临时JS UDF实现递归遍历JSON所有键的逻辑,匹配到目标键后直接返回对应值,适配你的场景的示例代码如下:

-- 定义递归提取指定键的JS UDF
CREATE TEMP FUNCTION json_recursive_extract(json_str STRING, target_key STRING)
RETURNS STRING
LANGUAGE js AS """
  function recursiveSearch(obj, key) {
    if (typeof obj !== 'object' || obj === null) return null;
    if (key in obj) return JSON.stringify(obj[key]);
    for (const k in obj) {
      const res = recursiveSearch(obj[k], key);
      if (res !== null) return res;
    }
    return null;
  }
  const json = JSON.parse(json_str);
  return recursiveSearch(json, target_key);
""";

-- 调用示例
SELECT json_recursive_extract(json_text, 'name') AS first_student
FROM UNNEST([
'{"class" : {"students" : {"name" : "Jane"}}}'
]) AS json_text;

运行后输出完全符合期望:

+-----------------+
| first_student   |
+-----------------+
| "Jane"          |
+-----------------+

方案说明

  • 支持任意嵌套层级的JSON结构,不需要提前知晓上层键名
  • 当前逻辑遇到多个同名目标键时会返回第一个匹配到的值,如需返回全部匹配结果,调整UDF返回数组类型即可
  • 普通业务场景下性能足够,超大规模数据处理时可配合递归CTE+原生JSON拆解逻辑进一步优化性能

方案2:正则提取(仅适合简单场景)

如果处理的JSON结构简单无特殊转义,也可以用正则快速匹配,优势是无需创建UDF:

SELECT REGEXP_EXTRACT(json_text, r'"name"\s*:\s*("[^"]*")') AS first_student
FROM UNNEST([
'{"class" : {"students" : {"name" : "Jane"}}}'
]) AS json_text;

方案说明

  • 执行速度快但容错性低,如果JSON中存在转义引号、目标键名出现在字符串值内的情况会提取错误,仅适合临时简单场景使用

内容的提问来源于stack exchange,提问作者py-r

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 16:39:02