json 解析 [{“id“:1,“name“:“apple“},{“id“:2,“name“:“banana“}]

复制代码
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 字段是数组结构时,需结合 explodesplit 等函数处理。

示例:解析 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_tupleget_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 数据
  • 支持复杂类型(STRUCTARRAYMAP)解析嵌套 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;

注意事项

  1. JSON 路径区分大小写
  2. 若字段不存在,返回 NULL
  3. 处理大 JSON 或复杂结构时,建议在建表时指定 JSON 格式(方法 4),性能更优
  4. Hive 2.3+ 支持 json_arrayjson_object 等函数用于构造 JSON

根据实际 JSON 结构选择合适的解析方法,简单场景用 get_json_objectjson_tuple,复杂场景建议在建表时定义 JSON 格式。

相关推荐
仟濹4 小时前
【Java加强】1 异常 | 打卡day1
java·开发语言·python
有诺千金4 小时前
VUE3入门很简单(4)---组件通信(props)
前端·javascript·vue.js
2501_944711434 小时前
Vue-路由懒加载与组件懒加载
前端·javascript·vue.js
AllData公司负责人4 小时前
【亲测好用】实时开发平台能力演示
java·c语言·数据库
pcm1235674 小时前
设计C/S架构的IM通信软件(3)
java·c语言·架构
咖啡啡不加糖4 小时前
Grafana 监控服务指标使用指南:打造可视化监控体系
java·后端·grafana
€8114 小时前
Java入门级教程26——序列化和反序列化,Redis存储Java对象、查询数据库与实现多消费者消息队列
java·拦截器·序列化和反序列化·数据库查询·redis存储java对象·多消费者消息队列
雨季6664 小时前
Flutter 三端应用实战:OpenHarmony “心流之泉”——在碎片洪流中,为你筑一眼专注的清泉
开发语言·前端·flutter·交互
多多*4 小时前
Mysql数据库相关 事务 MVCC与锁的爱恨情仇 锁的层次架构 InnoDB锁分析
java·数据库·windows·sql·oracle·面试·哈希算法
换日线°4 小时前
前端3D炫酷展开效果
前端·3d