SparkSQL — get_json_object函数详解
官网:
https://spark.apache.org/docs/latest/sql-ref-functions-builtin.html#json-functions
https://spark.apache.org/docs/latest/api/sql/index.html#get_json_object
- 从一个 JSON 字符串中提取指定路径(
path
)的值 - 返回值为 字符串类型(STRING)
- 如果路径不存在或 JSON 格式不合法,返回
NULL
参数名 | 类型 | 说明 |
---|---|---|
json_str |
STRING | 合法的 JSON 字符串 |
path |
STRING | JSON 的路径表达式(使用 $ 表示根,. 表示字段) |
博主用“龙珠”这个经典 IP,来演示
get_json_object
的各种用法。
1. 基础用法:提取 JSON 中的基本字段
-- 提取悟空的名字和技能
SELECT
get_json_object('{"name":"卡卡罗特", "skill":"龟派气功"}', '$.name') AS name,
get_json_object('{"name":"卡卡罗特", "skill":"龟派气功"}', '$.skill') AS skill;
2. 嵌套字段提取:从嵌套 JSON 中提取数据
-- 提取悟饭的变身形态和战斗力
SELECT
get_json_object(
'{"name":"比迪丽", "spouse":{"name":"悟饭", "form":"超级赛亚人", "power":500000}}',
'$.spouse.name'
) AS spouse_name,
get_json_object(
'{"name":"比迪丽", "spouse":{"name":"悟饭", "form":"超级赛亚人", "power":500000}}',
'$.spouse.form'
) AS spouse_form,
get_json_object(
'{"name":"比迪丽", "spouse":{"name":"悟饭", "form":"超级赛亚人", "power":500000}}',
'$.spouse.power'
) AS spouse_power;
3. 数组元素提取:从 JSON 数组中取元素
-- 提取特兰克斯的时间线
SELECT
get_json_object(
'{"name":"特兰克斯", "timelines": ["未来世界", "主宇宙", "超时空"]}',
'$.timelines[0]'
) AS first_timeline,
get_json_object(
'{"name":"特兰克斯", "timelines": ["未来世界", "主宇宙", "超时空"]}',
'$.timelines[2]'
) AS third_timeline;
4. 错误处理示例:路径不存在返回 NULL
-- 尝试提取不存在的字段
SELECT
get_json_object(
'{"name":"克林", "move":"狼牙风风拳"}',
'$.dragon_ball'
) AS dragon_ball;
tips:
用法 | 示例 |
---|---|
提取基本字段 | get_json_object(json, '$.name') |
提取嵌套字段 | get_json_object(json, '$.spouse.name') |
提取数组元素 | get_json_object(json, '$.hobbies[1]') |
多字段提取 | 多个 get_json_object 并列使用 |
错误处理 | 返回 NULL ,需检查路径和 JSON 合法性 |