Apache Doris JSON函数:轻松驾驭半结构化数据查询
你是否还在为日志分析、用户行为数据中的JSON格式字段头疼?作为运营或数据分析人员,面对{"user":{"name":"Alice","age":30},"actions":[{"type":"click","time":"10:00"},{"type":"purchase","time":"14:30"}]}这样的半结构化数据,如何快速提取用户年龄或统计购买行为?Apache Doris提供了一套完整的JSON函数工具集,让你无需复杂编程即可轻松查询JSON数据。本文将通过实际案例,带你掌握JSON函数的核心用法,读完你将能够:
- 使用
get_json_string提取嵌套JSON字段 - 通过
json_extract解析数组类型数据 - 掌握JSON路径(JSON Path)语法规则
- 了解性能优化的最佳实践
JSON函数基础:从路径到结果
JSON函数的核心在于JSON路径(JSON Path) 语法,它类似文件系统的路径表示法,使用.分隔对象层级,[]访问数组元素。例如$.user.name表示获取JSON对象中user字段下的name值。Apache Doris的JSON函数基于RapidJSON和头文件be/src/exprs/json_functions.h。
常用JSON函数速查表
| 函数名 | 描述 | 示例 |
|---|---|---|
get_json_string(json_str, path) | 提取字符串类型JSON值 | get_json_string('{"k1":"v1"}', '$.k1') → "v1" |
json_extract(json_str, path) | 提取原始JSON值(保留类型) | json_extract('{"arr":[1,2]}', '$.arr[0]') → 1 |
json_array_length(json_str) | 获取JSON数组长度 | json_array_length('[1,2,3]') → 3 |
表:Apache Doris核心JSON函数及用法示例,完整实现见be/src/exprs/json_functions.cpp#L325中的
print_json_value方法
实战案例:用户行为日志分析
假设我们有一张存储用户行为的表user_behavior,其中event_data字段存储JSON格式的行为数据:
CREATE TABLE user_behavior (
id INT,
event_data JSON NULL
) ENGINE=OLAP;
(表定义参考regression-test/suites/nereids_p0/insert_into_table/ddl/json_t.sql)
1. 提取用户ID和行为类型
SELECT
get_json_string(event_data, '$.user_id') AS user_id,
get_json_string(event_data, '$.action.type') AS action_type
FROM user_behavior
LIMIT 10;
该查询使用get_json_string提取字符串类型的用户ID和行为类型,适用于用户画像分析场景。注意当JSON路径不存在时返回NULL,可结合IFNULL函数处理默认值,如regression-test/suites/correctness/sql/test_ifnull_function1.sql中的测试用例:
SELECT IFNULL(get_json_string('{"k1":"v1"}', '$.k2'), 'UNKNOWN') AS default_value;
2. 解析数组类型数据
对于包含数组的JSON结构,如{"actions":[{"type":"click"},{"type":"purchase"}]},可使用json_extract配合数组索引提取特定元素:
SELECT
json_extract(event_data, '$.actions[0].type') AS first_action,
json_array_length(get_json_string(event_data, '$.actions')) AS action_count
FROM user_behavior;
其中json_array_length用于统计行为数量,实现逻辑见be/src/exprs/json_functions.cpp#L156的get_json_array_from_parsed_json方法。
3. 复杂路径查询
当JSON包含特殊字符或空格时,可使用双引号包裹路径片段:
SELECT get_json_string('{"user name":"Alice"}', '$."user name"');
对于数组通配符查询(如获取所有元素),Doris支持[*]语法,相关路径解析逻辑在be/src/exprs/json_functions.cpp#L210的parse_json_paths函数中实现。
性能优化建议
- 避免深层嵌套查询:JSON解析性能随路径深度增加而降低,建议将常用字段冗余为独立列
- 使用SIMD加速:Doris默认启用simdjson的矢量化解析,对于GB级JSON数据可获得10倍以上加速
- 测试用例参考:性能优化可参考regression-test/suites/variant_p0/sql/gh_data.sql中的大数据量查询场景
总结
Apache Doris的JSON函数为半结构化数据查询提供了高效解决方案,通过get_json_string、json_extract等函数组合,可满足日志分析、用户行为追踪等常见场景需求。核心实现基于业界领先的JSON解析库,确保在大数据量下仍保持高性能。完整的函数列表和最新特性可通过查阅源码或参与Apache Doris社区讨论获取。
本文示例均通过Doris regression test验证,测试用例位于regression-test/suites目录下,可直接作为生产环境参考。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



