ARTICLE DETAIL

资讯详情

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

StarRocks `get_json_double` 函数详解:从 JSON 字符串中提取浮点数值

StarRocks `get_json_double` 函数详解:从 JSON 字符串中提取浮点数值 StarRocksget_json_double函数详解从 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/starrocksget_json_double是 StarRocks 提供的 JSON 查询与处理函数之一用于按照 JSONPath 语法从 JSON 字符串的指定路径中解析并提取 DOUBLE 类型的浮点数值。本文以官方函数文档为主体结合 StarRocks BE 端源码json_functions.cpp、jsonpath.h与单元测试json_functions_test.cpp系统讲解其语法、路径书写规则、完整示例、边界行为与底层实现帮助你在实际查询中正确、高效地使用该函数。函数概述get_json_double的作用是从 JSON 字符串中按照指定的路径json_path找到目标节点并将其值转换为浮点型DOUBLE返回。该函数在 StarRocks 的 BE 端由 JsonFunctions::get_json_double 实现内部实际是模板函数_get_json_valueTYPE_DOUBLE的封装StatusOrColumnPtr JsonFunctions::get_json_double(FunctionContext* context, const Columns columns) { return _get_json_valueTYPE_DOUBLE(context, columns); }它属于 StarRocks 的get_json_*家族函数get_json_int、get_json_bigint、get_json_double、get_json_string同一族的其他函数通过替换模板类型参数TYPE_INT、TYPE_BIGINT、TYPE_VARCHAR复用同一套提取逻辑见 json_functions.cpp。该族函数对应的向量化注册声明位于 json_functions.h。语法与参数DOUBLE get_json_double(VARCHAR json_str, VARCHAR json_path)参数类型说明json_strVARCHAR待解析的 JSON 字符串json_pathVARCHARJSONPath 路径用于定位要提取的节点返回值DOUBLE提取并转换后的浮点数值JSONPath 路径书写规则json_path的语法遵循以下规则必须以$开头$代表 JSON 的根节点使用.作为路径分隔符逐级定位嵌套的 key例如$.k1、$.k1.k2使用[ ]表示数组下标下标从 0 开始计数例如[0]取第一个元素、[1]取第二个元素若 key 本身包含.则需要用双引号将该 key 包裹起来例如$.my.key避免与路径分隔符冲突路径内容中不能包含、[、]字符若json_str或json_path格式非法函数返回 NULL。以上规则与 BE 端 JSONPath 解析器的实现一致。在 jsonpath.cpp 中路径解析使用正则^([^\\[\]]*)((?:\[(?:[0-9\:\*])\])*)匹配「key 名 数组下标」组合key 部分明确排除了、[、]三个字符与文档描述完全对应。同时数组选择器支持三种形态见 jsonpath.harr[x]选取第 x 个元素下标从 0 开始arr[*]选取所有元素arr[1:3]选取切片左闭右开区间。示例以下示例均来自官方文档并在 MySQL 客户端中验证通过。1. 提取 key 为 k1 的值MySQL SELECT get_json_double({k1:1.3, k2:2}, $.k1); ------------------------------------------------- | get_json_double({k1:1.3, k2:2}, $.k1) | ------------------------------------------------- | 1.3 | -------------------------------------------------2. 提取 key 为 my.key 的数组中的第二个元素key 名包含点号.因此需要用双引号包裹[1]表示取数组下标为 1第二个的元素MySQL SELECT get_json_double({k1:v1, my.key:[1.1, 2.2, 3.3]}, $.my.key[1]); --------------------------------------------------------------------------- | get_json_double({k1:v1, my.key:[1.1, 2.2, 3.3]}, $.my.key[1]) | --------------------------------------------------------------------------- | 2.2 | ---------------------------------------------------------------------------3. 提取嵌套路径 k1.key - k2 数组中的第一个元素MySQL SELECT get_json_double({k1.key:{k2:[1.1, 2.2]}}, $.k1.key.k2[0]); --------------------------------------------------------------------- | get_json_double({k1.key:{k2:[1.1, 2.2]}}, $.k1.key.k2[0]) | --------------------------------------------------------------------- | 1.1 | ---------------------------------------------------------------------返回值与边界行为结合 BE 端单元测试 json_functions_test.cpp 中的参数化用例可以确认以下边界行为路径不存在或 key 不存在例如{k0: null}配$.k1返回 NULL值为 null例如{k1: null}配$.k1返回 NULL值为字符串例如{k1: value}配$.k1无法转为数值返回 NULL值为对象或数组例如{k1: {k2: 1}}或{k1: [1,2,3]}返回 NULL仅提取标量浮点值值为整数例如{k1: 1}配$.k1可以转换并返回1.0值为负数或小数例如{k1: -1}返回-1{k1: 1.1}返回1.1{k1: 3.14}返回3.14json_str 或 json_path 格式非法返回 NULLjson_str 或 json_path 本身为 NULL返回 NULL。从实现角度看上述行为由 json_functions.cpp 中的_full_json_query_implTYPE_DOUBLE逻辑保证对于每一行若 JSON 值或路径为空则直接输出 NULL路径解析失败时记录日志并输出 NULL提取到的切片若无法通过cast_vpjson_toTYPE_DOUBLE转换为浮点类型同样输出 NULL。底层实现原理get_json_double的完整处理链路如下字符串解析为 JSON_string_json将 VARCHAR 列中的每个 JSON 字符串解析为内部 JSON 值对象JsonValue若字符串不是合法 JSON则输出 NULL见 json_functions.cpp路径预解析与缓存native_json_path_prepare在 FRAGMENT_LOCAL 作用域内解析 JSONPath并将结果缓存在函数状态中避免每行重复解析路径见 json_functions.cpp。对于非常量路径则在每行通过JsonPath::parse动态解析路径提取通过JsonPath::extract在 velocypack 切片上按路径定位目标节点见 json_functions.cpp类型转换将提取到的切片通过cast_vpjson_toTYPE_DOUBLE, false转换为 DOUBLE 并写入结果列转换失败则写入 NULL见 json_functions.cpp。值得关注的是路径解析器jsonpath.cpp在数组越界场景下做了性能优化ArraySelectorSingle::iterate会先做边界检查仅在索引小于数组长度时才调用Slice::at从而避免对海量短数组逐行抛出 C 异常带来的锁竞争开销——这正是 StarRocks 面向大规模扫描场景的工程化细节。应用场景建议日志与半结构化数据解析当数据以 JSON 字符串形式存储在 VARCHAR 列中时可用get_json_double在查询时按需提取数值字段如埋点事件中的耗时、价格、评分等无需提前拆列与生成列结合加速查询StarRocks 支持 生成列可将高频使用的 JSON 提取结果物化为独立列配合索引显著加速过滤与排序避免每次查询都执行 JSON 解析家族函数按需选用需要整数值时优先考虑get_json_int/get_json_bigint需要字符串时使用get_json_string按目标类型选择对应函数可避免不必要的类型转换开销。相关文档JSON 函数与运算符总览StarRocks 全部 JSON 函数与运算符的导航页生成列将 JSON 提取结果物化以加速查询源码json_functions.cpp、jsonpath.h、jsonpath.cpp测试json_functions_test.cpp、flat_json_functions_test.cpp。关键词GET_JSON_DOUBLE、GET、JSON、DOUBLE、JSONPath、StarRocks【免费下载链接】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),仅供参考
返回列表