from_json:JSON 字符串解析
速查结论
from_json(jsonStr, schema[, options]) 是 Spark SQL 中用于将 JSON 字符串解析为结构体的函数。支持嵌套结构体和数组的解析。schema 可以是 DDL 字符串或 STRUCT 类型。
语法
from_json(jsonStr, schema[, options])
参数说明
| 参数 | 说明 |
|---|---|
jsonStr | 待解析的 JSON 字符串 |
schema | 目标 schema,DDL 字符串或 STRUCT 类型 |
options | 可选,解析选项的 Map |
返回值:按 schema 解析出的结构体。
Since: 2.2.0
示例
基础解析
-- 扁平 JSON
SELECT from_json('{"a":1, "b":0.8}', 'a INT, b DOUBLE');
-- 结果: {"a":1,"b":0.8}
带 options 解析
-- 指定时间戳格式
SELECT from_json('{"time":"26/08/2015"}', 'time Timestamp', map('timestampFormat', 'dd/MM/yyyy'));
-- 结果: {"time":2015-08-26 00:00:00}
嵌套结构体与数组
-- 嵌套数组的结构体
SELECT from_json(
'{"teacher": "Alice", "student": [{"name": "Bob", "rank": 1}, {"name": "Charlie", "rank": 2}]}',
'STRUCT<teacher: STRING, student: ARRAY<STRUCT<name: STRING, rank: INT>>>'
);
-- 结果: {"teacher":"Alice","student":[{"name":"Bob","rank":1},{"name":"Charlie","rank":2}]}
取出解析结果中的字段
-- 用 . 访问结构体字段
SELECT
from_json(json_col, 'name STRING, age INT').name AS name,
from_json(json_col, 'name STRING, age INT').age AS age
FROM t;
常见报错与避坑指南
JSON 格式不合法
JSON 字符串必须是合法的 JSON 格式(双引号包裹 key),单引号或不加引号的 key 会导致解析失败。
-- 错误写法:单引号 key 不是合法 JSON
SELECT from_json("{'a':1}", 'a INT');
-- 返回 NULL
-- 正确写法:双引号 key
SELECT from_json('{"a":1}', 'a INT');
-- 结果: {"a":1}
Schema 与 JSON 结构不匹配
schema 定义的字段必须在 JSON 中存在(或可使用 options 配置容错),类型也必须兼容。
-- JSON key 与 schema 字段名不一致
SELECT from_json('{"x":1, "y":2}', 'a INT, b INT');
-- 结果字段 a 和 b 均为 NULL
-- 正确做法:schema 字段名与 JSON key 一致
SELECT from_json('{"a":1, "b":2}', 'a INT, b INT');
📱关注公众号
「数据仓库技术」文章同步更新,不错过每一篇干货

💬加群交流
备注「数据仓库技术」加入社群,每日一道大厂SQL真题
