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 字段是数组结构时,需结合 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;

注意事项

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

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

相关推荐
程序人生888几秒前
从“把隐私文件上传到别人云端“到本地可控:DocConverter Web 立项初心与架构选型
前端·图像处理·人工智能·opencv·架构·ocr·文心一言
省钱兄--zs2 分钟前
24小时自助健身房系统软件开发实战:从架构设计到部署全指南
java·数据仓库·spring boot·系统架构·需求分析
IT研究室5 分钟前
最新计算机毕业设计选题推荐-基于spring boot的智慧教学资源管理与互动交流平台-网站-文档指导-Java-springboot
java·spring boot·课程设计
蜗牛互联网7 分钟前
Java HttpClient 调用 Gemini 图像理解与金额字段校验
java·开发语言·人工智能·后端·python
开开心心就好8 分钟前
视频里的图片怎么提取?双击一下就导出
java·前端·人工智能·spring·智能手机·intellij-idea·excel
蜗牛互联网9 分钟前
Python Responses API视觉输入与本地金额校验最小实现
java·开发语言·人工智能·后端·python
爱喝水的小周11 分钟前
实验十 Vue‑Router 王者荣耀战绩查询 APP 开发实践
前端·javascript·vue.js
yexianglunbai11 分钟前
Vue 3 全面详解:从核心特性到工程化实践
前端·javascript·vue.js
程序猿_极客12 分钟前
【免费】分享一套优质的基于Java的智慧养老院管理系统的设计与实现(带可视化),源码+文档+视频详解(讲解)
java·spring boot·后端·养老院管理系统
传人once13 分钟前
选择文件按钮样式如何美化
前端·html·css3·jquery·html5