StarRocks 的 json_keys 函数:从 JSON 对象中提取顶层键的完整指南
StarRocks 的 json_keys 函数从 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_keys函数为主题讲解如何从 JSON 对象中提取其顶层键并以 JSON 数组形式返回。你将掌握json_keys的完整语法、参数规则、返回值语义以及如何借助可选的path参数从嵌套 JSON 对象包括数组内嵌的对象中提取键并了解该函数在 StarRocks BE 端的真实实现路径与测试验证方式可直接用于日志解析、半结构化数据分析等实战场景。函数概述json_keys是 StarRocks 提供的 JSON 查询与处理函数 之一用于获取 JSON 对象的键集合。功能定义json_keys返回 JSON 对象的顶层键以 JSON 数组的形式呈现如果指定了path参数则返回该路径所指向的 JSON 对象的顶层键。典型场景当你面对以 JSON 格式存储的半结构化数据如日志事件、用户画像、埋点数据时常常需要先看清某个对象里有哪些字段再决定后续如何抽取。json_keys正是完成这种字段清单探测的轻量工具可与json_query、arrow function、json_exists等函数组合使用完整函数清单见 JSON functions overview。语法json_keys(json_doc[, path])参数说明参数是否必填说明json_doc必填需要提取键的 JSON 文档必须是一个 JSON 对象path可选路径表达式用于定位 JSON 文档中某个对象。路径一般以$开头以.作为路径分隔符[]用作数组下标下标从 0 开始关于path参数的更多细节$表示 JSON 文档的根节点。.用于逐层下钻对象例如$.c表示取顶层键c所对应的值。[]用于定位数组中的元素下标从 0 开始例如$[2]表示取数组的第 3 个元素。StarRocks 的 JSON path 语法并不完全等同于 SQL/JSON 标准路径规范具体的路径语法约定可参考 JSON path expressions。返回值json_keys的返回值遵循以下规则成功时返回一个 JSON 数组数组元素为 JSON 对象的所有顶层键以字符串形式。空对象如果 JSON 对象为空{}返回空数组[]。非对象输入如果json_doc本身不是 JSON 对象例如是数组、数值或字符串返回NULL。路径失效如果指定的path不能定位到文档中的任何值或定位到的值不是 JSON 对象返回NULL。嵌套对象如果 JSON 文档是数组且数组中嵌套了 JSON 对象可以通过path参数定位到该对象并提取其键。示例详解以下示例完整展示了json_keys的各种行为。示例 1空 JSON 对象返回空数组select json_keys({}); ----------------- | json_keys({}) | ----------------- | [] | -----------------示例 2返回 JSON 对象的顶层键select json_keys({a: 1, b: 2, c: 3}); ---------------- | json_keys(1) | ---------------- |[a, b, c] | ----------------注意json_keys只返回顶层键不包含嵌套对象的内部键。例如对于{a: {d: 1}}返回的是[a]而不是[d]。示例 3通过 path 返回嵌套对象的键select json_keys({a: 1, b: 2, c: {d: 3, e: 4, f: 5}}, $.c); --------------------------------------------------------------------- | json_keys({a: 1, b: 2, c: {d: 3, e: 4, f: 5}}, $.c) | --------------------------------------------------------------------- | [d, e, f] | ---------------------------------------------------------------------示例 4path 不存在时返回 NULLselect json_keys({a: 1, b: 2, c: {d: 3, e: 4, f: 5}}, $.e); --------------------------------------------------------------------- | json_keys({a: 1, b: 2, c: {d: 3, e: 4, f: 5}}, $.e) | --------------------------------------------------------------------- | NULL | ---------------------------------------------------------------------示例 5JSON 文档不是对象时返回 NULLselect json_keys([1, 2, {a: 1, b: 2}]); --------------------------------------- | json_keys([1, 2, {a: 1, b: 2}]) | --------------------------------------- | NULL | ---------------------------------------示例 6数组内嵌对象通过 path 提取键select json_keys([0, 1, {a: 1, b: 2}], $[2]); ----------------------------------------------- | json_keys([0, 1, {a: 1, b: 2}], $[2]) | ----------------------------------------------- | [a, b] | -----------------------------------------------底层实现原理源码级解析在 StarRocks 的 BEBackend端json_keys的实现位于 be/src/exprs/json_functions.cpp。其入口函数JsonFunctions::json_keys会根据调用方式与数据形态分派到三条实现路径无 path 调用_json_keys_without_pathbe/src/exprs/json_functions.cpp直接遍历json_doc的根节点。若根节点不是对象!vslice.isObject()则追加NULL否则通过vpack::ObjectIterator遍历对象的键值对把每个键iter.key.copyString()追加进一个vpack::ArrayBuilder最终构造出一个 JSON 数组。有 path 调用 常规 JSON_full_json_keys_with_pathbe/src/exprs/json_functions.cpp先通过get_prepared_or_parse解析并缓存路径表达式再调用JsonPath::extract从文档中取出path定位到的切片slice。只有定位结果isObject()时才提取键否则追加NULL包括 path 不存在或指向非对象两种情况。有 path 调用 扁平 JSONflat JSON_flat_json_keys_with_pathbe/src/exprs/json_functions.cpp针对 StarRocks 的扁平 JSON 列存储做了优化先通过_extract_from_flat_json把扁平列还原成常规 JSON再按完整匹配full match/ 部分匹配partial match两种状态分别处理随后走与常规路径相同的键提取逻辑。由此可以推断返回值NULL的判定发生在切片层只要path解析失败、定位结果为空或定位到的不是对象统一返回NULL。键的提取使用底层 JSON 引擎velocypack的ObjectIterator键以字符串形式按文档顺序写入数组示例输出中键的顺序与输入 JSON 中书写的顺序一致ObjectIterator的遍历顺序取决于底层 JSON 实现。函数通过ColumnBuilderTYPE_JSON构建返回列因此每一行的结果都是一个独立的JSON类型值可以直接参与后续 JSON 函数链式运算。测试验证json_keys的行为在 BE 端单元测试中得到完整验证见 be/test/exprs/json_functions_test.cpp。测试通过参数化方式覆盖了以下典型用例输入 JSONpath期望结果{ k1: 1, k2: 2 }无[k1, k2]{ k1: v1 }无[k1]{ k1: {k2: 1} }无[k1]不递归嵌套键{ }无[]空对象返回空数组[]无NULL数组不是对象1无NULL数值不是对象hehe无NULL字符串不是对象{ k1: v1 }$.k1NULL定位到标量非对象{ k1: v1 }$.k3NULLpath 不存在{ k1: {k2: 1} }$.k1[k2]定位到嵌套对象这些用例与文档中的示例相互印证尤其是定位到标量也返回 NULL这一细节示例 4 的变体在使用path提取嵌套键时值得特别注意。此外扁平 JSON 场景下json_keys的路径行为在 be/test/exprs/flat_json_functions_test.cpp 中有对应测试覆盖。使用建议与边界条件仅适用于对象json_keys的输入与path定位目标都必须是 JSON 对象否则返回NULL。若数据源中同一列混合了对象与数组建议先用json_exists或条件表达式过滤再调用json_keys。只取顶层键该函数不递归。需要深层字段清单时可以逐层指定path如$.a、$.a.b分别调用。与生成列配合加速如果经常对同一批 JSON 字段做键探测或后续抽取可以考虑使用 generated columns 将 JSON 字段解析结果物化从而加速查询。这是 StarRocks 官方推荐的 JSON 加速手段。结果可继续链式处理返回的 JSON 数组可以继续作为其他 JSON 函数或算子如json_length、json_query、cast的输入实现多级解析。相关参考JSON 函数与算子总览JSON 路径表达式生成列加速 JSON 查询源码实现be/src/exprs/json_functions.cpp单元测试be/test/exprs/json_functions_test.cpp【免费下载链接】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),仅供参考

相关新闻

硬件工程师AI编程手册 -【编程环境准备】安装 Cursor

硬件工程师AI编程手册 -【编程环境准备】安装 Cursor

安装 CursorCursor 是基于 VS Code 的 AI 原生代码编辑器(官网 https://cursor.com)。支持 AI Agent 与工程师协作在其编辑器内编写代码,并在内嵌终端内编译与运行。 安装步骤(Windows / macOS / Linux): 1…

2026/9/23 3:58:34 阅读更多 →
Java气象数据可视化:SpringBoot+Redis+Hadoop全链路

Java气象数据可视化:SpringBoot+Redis+Hadoop全链路

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/21 10:39:19 阅读更多 →
通用数据标签体系设计方案:从对象分层到口径统一

通用数据标签体系设计方案:从对象分层到口径统一

简介:一套面向数据产品经理、数据分析师及企业数据团队的通用数据标签体系设计方案,重点解决用户行为、画像构建与精细化运营中的数据标准化问题。方案从数据标签基本概念入手,梳理指标与标签的关系,解释标签如何支撑用户画像&…

2026/9/22 4:17:27 阅读更多 →

最新新闻

SSM框架实战:高校学报管理系统设计与实现解析

SSM框架实战:高校学报管理系统设计与实现解析

1. 项目概述与选型背景第一次看到“SSM商丘工学院学报管理系统”这个标题时,我其实挺有感触的。高校内部的业务管理系统,尤其是学报管理这种带有明确流程特征的场景,一直是SSM框架最典型的应用土壤。Spring、SpringMVC、MyBatis这三位老搭档组…

2026/9/23 3:58:31 阅读更多 →
AI日报背后的工程实践:Agent架构、密钥安全与LLM输出稳定性

AI日报背后的工程实践:Agent架构、密钥安全与LLM输出稳定性

1. 从一份日报标题说起:AI 日报到底在记录什么看到"AI 日报 2026-09-18"这个标题,很多人第一反应是"这不就是个新闻汇总吗"。但如果你真的每天跟踪 AI 领域的动态,就会知道一份有价值的日报远不止是链接堆砌。它本质上是…

2026/9/23 3:58:31 阅读更多 →
为长时运行的 AI 编码代理设计持久化 Harness:OpenAI 风格仓库模板 AGENTS.md 深度解析

为长时运行的 AI 编码代理设计持久化 Harness:OpenAI 风格仓库模板 AGENTS.md 深度解析

为长时运行的 AI 编码代理设计持久化 Harness:OpenAI 风格仓库模板 AGENTS.md 深度解析 【免费下载链接】learn-harness-engineering Harness engineering beginner tutorial, from 0 to 1 项目地址: https://gitcode.com/gh_mirrors/le/learn-harness-engineerin…

2026/9/23 3:58:31 阅读更多 →
穿越火线怎么调烟雾头图解原理:5分钟吃透底层逻辑

穿越火线怎么调烟雾头图解原理:5分钟吃透底层逻辑

穿越火线怎么调烟雾头图解原理:5分钟吃透底层逻辑 CF手游里的烟雾弹为啥总是飘歪?官方教程只告诉你“按住技能键”,却从不解释背后的物理引擎。这种 官方文档太长抓不住重点 的体验,让无数玩家在实战中只能靠玄学猜。今天咱们不背口诀,直接上…

2026/9/23 3:58:31 阅读更多 →
PlantUML 内部 DITAA 引擎解析:`ascii2image` 核心包与 ASCII 艺术到图像的转换管线

PlantUML 内部 DITAA 引擎解析:`ascii2image` 核心包与 ASCII 艺术到图像的转换管线

开发工具文档 【免费下载链接】plantuml Generate diagrams from textual description 项目地址: https://gitcode.com/gh_mirrors/pl/plantuml 点击查看 免费下载 本篇技术指南聚焦于 PlantUML 仓库中内置的 ditaa(Diagrams Through ASCII Art&#xf…

2026/9/23 3:58:30 阅读更多 →
代码世界模型:从编码智能体到理解世界的数字大脑

代码世界模型:从编码智能体到理解世界的数字大脑

直接说结论:代码世界模型这个提法,乍一听很像概念炒作,但你把它拆开看,其实是把“让大模型通过写代码来理解世界”这个路线推到极致的一种尝试。我最近半年一直在折腾编码智能体相关的项目,从最早的代码补全&#xff0…

2026/9/23 3:57:30 阅读更多 →

日新闻

3招搞定手机怎么下载微信面试难题实战项目解析

3招搞定手机怎么下载微信面试难题实战项目解析

3招搞定手机怎么下载微信面试难题实战项目解析 面试被问“手机怎么下载微信”背后的原理,90%的人答不上来。别笑,这看似弱智的问题,实则是考察你对移动应用分发机制、安全校验及网络协议理解的试金石。我带过不少校招新人,他们背了八股文,却连一个A…

2026/9/23 0:00:23 阅读更多 →
2k显示屏性能优化踩坑:版本升级后API全变了,这份源码解析救了我

2k显示屏性能优化踩坑:版本升级后API全变了,这份源码解析救了我

2k显示屏性能优化踩坑:版本升级后API全变了,这份源码解析救了我 刚把开发环境的显示器从1080P换到2K,跑老项目直接报错,版本升级后 API…

2026/9/23 0:01:25 阅读更多 →
3步搞定美眉图实战项目,告别官方文档抓不住重点

3步搞定美眉图实战项目,告别官方文档抓不住重点

3步搞定美眉图实战项目,告别官方文档抓不住重点 官方文档翻了三遍还是云里雾里?别急,美眉图在实战项目中常被用来做数据可视化,但它的原理比你想的简单。今天咱们直接上手,用一个完整的小项目把美眉图跑通,不再死磕那些冗长的理论说明。…

2026/9/23 0:01:25 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/22 4:32:41 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/22 4:38:57 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/22 8:51:04 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/21 15:36:51 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/21 15:36:51 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/22 2:43:42 阅读更多 →