SELECT
get_json_object(item, '$.id') AS id,
get_json_object(item, '$.name') AS name
FROM (
SELECT explode(split(regexp_replace(regexp_replace(
'[{"id":1,"name":"apple"},{"id":2,"name":"banana"}]',
'\\[|\\]', ''), -- 去除首尾的[]
'\\},\\{', '\\}\\|\\{'), -- 用|替换},{作为分隔符
'\\|')) AS item -- 按|分割为数组并展开
) t;
在 Hive 中解析 JSON 数据可以通过多种函数实现,根据 JSON 的结构(简单 JSON 字符串、数组或嵌套 JSON)选择合适的方法。以下是常用的 JSON 解析方式:
1. 基础 JSON 函数
适用于解析简单结构的 JSON 字符串。
get_json_object(string json_string, string path)
- 功能:从 JSON 字符串中提取指定路径的值
- 参数:
json_string
:JSON 格式的字符串path
:JSON 路径(使用.
表示层级,$
表示根节点)
- 注意:只能返回单个值,不支持复杂嵌套提取
示例:
假设有表 json_data
包含字段 info
(JSON 格式):
plaintext
info = '{"name":"Alice","age":25,"address":{"city":"Beijing","street":"Main St"}}'
提取信息:
sql
SELECT
get_json_object(info, '$.name') AS name,
get_json_object(info, '$.age') AS age,
get_json_object(info, '$.address.city') AS city
FROM json_data;
结果:
plaintext
name | age | city
------|-----|--------
Alice | 25 | Beijing
2. 解析 JSON 数组
当 JSON 字段是数组结构时,需结合 explode
和 split
等函数处理。
示例:解析 JSON 数组
假设有 JSON 数组:[{"id":1,"name":"apple"},{"id":2,"name":"banana"}]
sql
SELECT
get_json_object(item, '$.id') AS id,
get_json_object(item, '$.name') AS name
FROM (
SELECT explode(split(regexp_replace(regexp_replace(
'[{"id":1,"name":"apple"},{"id":2,"name":"banana"}]',
'\\[|\\]', ''), -- 去除首尾的[]
'\\},\\{', '\\}\\|\\{'), -- 用|替换},{作为分隔符
'\\|')) AS item -- 按|分割为数组并展开
) t;
结果:
plaintext
id | name
---|-------
1 | apple
2 | banana
3. 复杂 JSON 解析:json_tuple
json_tuple
是 get_json_object
的优化版本,可同时提取多个字段,效率更高。
语法:
sql
json_tuple(json_string, key1, key2, ...)
示例:
sql
SELECT
json_tuple(info, 'name', 'age') AS (name, age)
FROM json_data;
4. 建表时指定 JSON 格式
如果表的数据源是 JSON 文件,可以在建表时直接指定 JSON 格式,自动解析字段。
示例:
sql
CREATE TABLE json_table (
name STRING,
age INT,
address STRUCT<city:STRING, street:STRING>
)
ROW FORMAT SERDE 'org.apache.hive.hcatalog.data.JsonSerDe'
LOCATION '/path/to/json/files';
- 使用
JsonSerDe
序列化 / 反序列化 JSON 数据 - 支持复杂类型(
STRUCT
、ARRAY
、MAP
)解析嵌套 JSON
5. 解析嵌套 JSON
对于多层嵌套的 JSON,可结合 STRUCT
类型和 get_json_object
:
示例:
sql
SELECT
get_json_object(info, '$.name') AS name,
struct(
get_json_object(info, '$.address.city') AS city,
get_json_object(info, '$.address.street') AS street
) AS address
FROM json_data;
注意事项
- JSON 路径区分大小写
- 若字段不存在,返回
NULL
- 处理大 JSON 或复杂结构时,建议在建表时指定 JSON 格式(方法 4),性能更优
- Hive 2.3+ 支持
json_array
、json_object
等函数用于构造 JSON
根据实际 JSON 结构选择合适的解析方法,简单场景用 get_json_object
或 json_tuple
,复杂场景建议在建表时定义 JSON 格式。