ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

StarRocks json_string 函数详解:将 JSON 对象序列化为 JSON 字符串

StarRocks json_string 函数详解:将 JSON 对象序列化为 JSON 字符串 StarRocks json_string 函数详解将 JSON 对象序列化为 JSON 字符串【免费下载链接】starrocksThe worlds fastest open query engine for sub-second analytics both on and off the data lakehouse. With the flexibility to support nearly any scenario, StarRocks provides best-in-class performance for multi-dimensional analytics, real-time analytics, and ad-hoc queries. A Linux Foundation project.项目地址: https://gitcode.com/GitHub_Trending/st/starrocks本篇指南围绕 StarRocks 的 JSON 函数json_string展开讲解其语法、参数、返回值与 NULL 处理行为并结合后端BE源码剖析该函数如何把一个JSON类型的对象高效地序列化为VARCHAR字符串。读完本文你可以掌握json_string与parse_json的往返配合方式理解其在查询结果导出、与外部系统交互以及生成列场景中的实际用法并能从源码层面确认其执行路径。功能概述与定位json_string的作用是将 JSON 对象转换为 JSON 字符串JSON string。在 StarRocks 的 JSON 函数族中它与parse_json互为逆操作parse_json把字符串解析为原生JSON类型列json_string则把原生JSON值重新序列化为文本形式输出。这一点也可以从函数注册表中得到印证在 gensrc/script/functions.py 中两个函数相邻注册[110003, parse_json, False, False, JSON, [VARCHAR], JsonFunctions::parse_json], [110004, json_string, False, True, VARCHAR, [JSON], JsonFunctions::json_string],从注册信息可以看出json_string的函数 ID 为110004接受一个JSON类型参数返回VARCHAR映射到 BE 端的JsonFunctions::json_string实现。完整的 JSON 函数与运算符列表可参见 JSON 函数与运算符总览。语法json_string(json_object_expr)参数json_object_expr表示 JSON 对象的表达式。该对象可以是一个 JSON 列也可以是由PARSE_JSON等 JSON 构造函数产生的 JSON 对象。返回值返回VARCHAR值。使用示例示例 1将 JSON 对象转换为 JSON 字符串select json_string({Name: Alice}); ---------------------------------- || json_string({Name: Alice}) | ---------------------------------- || {Name: Alice} | ----------------------------------示例 2将PARSE_JSON的结果转换为 JSON 字符串select json_string(parse_json({Name: Alice})); ---------------------------------- || json_string({Name: Alice}) | ---------------------------------- || {Name: Alice} | ----------------------------------两个示例说明无论是直接传入的 JSON 对象表达式还是先经parse_json构造出的JSON类型值json_string都会输出与其内容一致的 JSON 文本。需要留意的是序列化结果的具体格式例如成员顺序由底层 JSON 存储结构决定示例中的Name字段顺序仅反映单成员对象的表现多成员对象的输出顺序不应作为业务约定依赖。NULL 处理行为json_string对空值的行为非常直观输入为 NULL 时返回 NULL。这一点在 BE 源码中可以直接确认be/src/exprs/json_functions.cpp 中的实现L128-L146逐行处理输入列StatusOrColumnPtr JsonFunctions::json_string(FunctionContext* context, const Columns columns) { ColumnViewerTYPE_JSON viewer(columns[0]); ColumnBuilderTYPE_VARCHAR result(columns[0]-size()); for (int row 0; row columns[0]-size(); row) { if (viewer.is_null(row)) { result.append_null(); } else { JsonValue* json viewer.value(row); auto json_str json-to_string(); if (!json_str.ok()) { result.append_null(); } else { result.append(json_str.value()); } } } return result.build(ColumnHelper::is_all_const(columns)); }从源码可以确认三个关键行为向量化实现该函数通过ColumnViewer/ColumnBuilder以列式批量处理整列数据而非逐行调用这与 StarRocks BE 的向量化执行模型一致NULL 透传输入行为 NULL 时输出行直接置 NULL不会报错序列化失败兜底若json-to_string()序列化失败!json_str.ok()该行的结果同样落为 NULL而不是让整条查询失败。同时头文件 be/src/exprs/json_functions.h 中的注释明确了参数与返回类型约定参数为JsonColumn返回BinaryColumn与注册表中的JSON - VARCHAR签名相互印证。与 parse_json 的往返配合由于parse_json和json_string构成一对可逆操作实践中常见的组合有两种字符串 - JSON - 字符串先用parse_json把脏数据或压缩格式的文本解析为JSON类型解析失败时按上下文返回 NULL再用json_string重新序列化起到“规范化/校验”作用JSON 列 - 文本导出从 JSON 列中取出或改写后的 JSON 对象转回文本以便写入外部系统、拼接消息体或与其他 VARCHAR 数据做字符串运算。parse_json本身的实现同样位于 be/src/exprs/json_functions.cppL101-L126其内部基于JsonValue::parse完成字符串到JSON值的解析因此“解析再序列化”的往返路径在 BE 端是闭环的。与 json_pretty 的区别在同一源文件中紧邻json_string的还有json_pretty实现L148-L172它通过开启 VPack 的prettyPrint选项输出带缩进的格式化 JSON。二者区别在于json_string输出紧凑的 JSON 文本适合写入、传输与下游解析json_pretty输出便于人工阅读的格式化文本通常仅用于调试展示。如果只需要拿到“JSON 字符串”用于程序化处理应使用json_string。典型应用场景结合生成列加速查询官方文档提示可以通过生成列generated columns加速 JSON 查询。典型做法是在表上定义一个由 JSON 字段提取生成的普通列例如用get_json_string提取某个路径再为该列建立索引查询时优化器可将谓词下推到生成的普通列上避免对整列 JSON 反复求值。完整的生成列机制说明参见 generated columns。小结与延伸阅读函数签名json_string(json_object_expr) - VARCHAR函数 ID110004注册于 gensrc/script/functions.py实现入口be/src/exprs/json_functions.cpp 中JsonFunctions::json_stringL128-L146接口声明见 be/src/exprs/json_functions.h行为特征向量化执行、NULL 输入返回 NULL、序列化失败行兜底为 NULL相关函数parse_json逆操作、json_pretty格式化输出函数族全集见 JSON 函数与运算符总览。【免费下载链接】starrocksThe worlds fastest open query engine for sub-second analytics both on and off the data lakehouse. With the flexibility to support nearly any scenario, StarRocks provides best-in-class performance for multi-dimensional analytics, real-time analytics, and ad-hoc queries. A Linux Foundation project.项目地址: https://gitcode.com/GitHub_Trending/st/starrocks创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表