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 格式。

相关推荐
Cache技术分享几秒前
290. Java Stream API - 从文本文件的行创建 Stream
前端·后端
陈_杨3 分钟前
前端成功转鸿蒙开发者真实案例,教大家如何开发鸿蒙APP--ArkTS 卡片开发完全指南
前端·harmonyos
阿里巴巴P8高级架构师4 分钟前
从0到1:用 Spring Boot 4 + Java 21 打造一个智能AI面试官平台
java·后端
stevenzqzq6 分钟前
trace和Get thread dump的区别
java·android studio·断点
桦说编程7 分钟前
并发编程踩坑实录:这些原则,帮你少走80%的弯路
java·后端·性能优化
程序猿零零漆7 分钟前
Spring之旅 - 记录学习 Spring 框架的过程和经验(十三)SpringMVC快速入门、请求处理
java·学习·spring
BHXDML7 分钟前
JVM 深度理解 —— 程序的底层运行逻辑
java·开发语言·jvm
小杨同学499 分钟前
C 语言实战:枚举类型实现数字转星期(输入 1~7 对应星期几)
前端·后端
tkevinjd9 分钟前
net1(Java中的网络编程、TCP的三次握手与四次挥手)
java
码头整点薯条10 分钟前
基于Java实现的简易规则引擎(日常开发难点记录)
java·后端