BigQuery如何编写通用JS UDF实现任意结构JSON反序列化
BigQuery 通用JSON解析UDF实现方案
核心限制说明:BigQuery是强类型SQL引擎,所有函数(含自定义UDF)的返回类型、数据结构必须在函数声明阶段静态确定,查询执行过程中无法动态变更返回结构,因此不存在完全不定义返回结构、直接输出任意格式结构化结果的实现。以下方案均可实现一次编写函数、无需修改函数定义即可解析任意结构JSON字符串的需求:
- 方案1:固定返回BigQuery原生JSON类型
目前BigQuery原生JSON类型已正式可用,无需依赖预览版功能。你可以将UDF的返回类型固定声明为JSON,JS侧仅需做基础的JSON.parse即可,无论输入的JSON是什么结构,都能正常返回解析后的结果,后续查询时按需通过JSON提取函数取目标字段即可,完全不需要调整UDF定义。
对应UDF实现代码:
CREATE TEMP FUNCTION de_serialize_json(json_string STRING) RETURNS JSON LANGUAGE js AS r""" return JSON.parse(json_string) """;
方案2:固定返回通用键值对数组结构
如果需要直接拿到可直接关联查询的结构化结果,可以将返回类型固定为通用的路径-键-值结构:ARRAY<STRUCT<path STRING, key STRING, value STRING>>。在JS UDF内部实现一次递归遍历逻辑,把任意嵌套结构的JSON全量打平,每个字段对应一条记录,存储字段的完整路径、键名、字符串格式的值。这个UDF一次编写后可以复用所有JSON解析场景,不需要根据输入JSON的结构调整返回类型定义,后续查询时通过path字段过滤即可拿到目标值。方案3:直接使用BigQuery原生JSON解析函数
目前BigQuery原生PARSE_JSON函数已正式发布,完全不需要自定义JS UDF即可实现JSON解析,性能远高于JS UDF,也没有UDF的调用资源限制,直接传入JSON字符串即可返回解析后的JSON类型结果,是优先级最高的实现方式。
基础使用示例:
-- 直接解析字段值为JSON类型 SELECT PARSE_JSON(json_string_col) AS parsed_result FROM `your_table`;
内容的提问来源于stack exchange,提问作者Aishwary Shukla
相关产品推荐
相关产品推荐

