Apache Doris JSON函数:轻松驾驭半结构化数据查询

Apache Doris JSON函数:轻松驾驭半结构化数据查询

【免费下载链接】doris Apache Doris is an easy-to-use, high performance and unified analytics database. 【免费下载链接】doris 项目地址: https://gitcode.com/gh_mirrors/dori/doris

你是否还在为日志分析、用户行为数据中的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#L156get_json_array_from_parsed_json方法。

3. 复杂路径查询

当JSON包含特殊字符或空格时,可使用双引号包裹路径片段:

SELECT get_json_string('{"user name":"Alice"}', '$."user name"');

对于数组通配符查询(如获取所有元素),Doris支持[*]语法,相关路径解析逻辑在be/src/exprs/json_functions.cpp#L210parse_json_paths函数中实现。

性能优化建议

  1. 避免深层嵌套查询:JSON解析性能随路径深度增加而降低,建议将常用字段冗余为独立列
  2. 使用SIMD加速:Doris默认启用simdjson的矢量化解析,对于GB级JSON数据可获得10倍以上加速
  3. 测试用例参考:性能优化可参考regression-test/suites/variant_p0/sql/gh_data.sql中的大数据量查询场景

总结

Apache Doris的JSON函数为半结构化数据查询提供了高效解决方案,通过get_json_stringjson_extract等函数组合,可满足日志分析、用户行为追踪等常见场景需求。核心实现基于业界领先的JSON解析库,确保在大数据量下仍保持高性能。完整的函数列表和最新特性可通过查阅源码或参与Apache Doris社区讨论获取。

本文示例均通过Doris regression test验证,测试用例位于regression-test/suites目录下,可直接作为生产环境参考。

【免费下载链接】doris Apache Doris is an easy-to-use, high performance and unified analytics database. 【免费下载链接】doris 项目地址: https://gitcode.com/gh_mirrors/dori/doris

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值