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

相关推荐
咩咩啃树皮6 小时前
第40篇:Vue3组件化开发精讲——组件拆分、复用、父子通信、工程化架构
java·前端·架构
阳光是sunny6 小时前
LangGraph中的Reducer是什么
前端·人工智能·后端
触底反弹6 小时前
一文搞懂 Tailwind CSS 弹性布局:从原理到实战
前端·css·html
阳光是sunny6 小时前
从链到图:LangGraph 入门基础全解析
前端·人工智能·后端
鱟鲥鳚7 小时前
Spring Boot 集成 LangChain4j:从模型调用到 Tool Calling(Demo版)
java·spring boot
小林ixn7 小时前
从 ??= 到 onKeyDown:一个 React 组件的“自我修养”
前端·javascript·react.js
REDcker7 小时前
显示分辨率标准对照详解
前端·网络·分辨率·显示·屏幕
এ慕ོ冬℘゜8 小时前
前端实战:jQuery 多条件联合搜索(标题模糊查询 + 日历时间段筛选)
前端·javascript·jquery
武子康8 小时前
Search Console Platform Properties 扩大 SEO 资产边界:从 Page Ranking 到 Topic Coverage(5 类误读边界 + 3 表数据层设计)
前端·人工智能·后端
大模型码小白8 小时前
【Python零基础教程】继承、多态与魔法函数:面向对象编程三大核心特性详解
java·大数据·开发语言·人工智能·python·ai编程