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

相关推荐
金銀銅鐵9 分钟前
[java] 编译之后的记录类(Record Classes)长什么样子(上)
java·jvm·后端
@PHARAOH25 分钟前
WHAT - cursor cli 开发范式
前端·ai·ai编程
子兮曰1 小时前
深入 HTML-in-Canvas:当 Canvas 学会了渲染 DOM,前端图形生态要变天了
前端·javascript·canvas
ws_qy1 小时前
从大模型原理到前端 AI Coding 工程化实践
前端·ai编程
倾颜2 小时前
React 19 源码主线拆解 04:Fiber 到底是什么,React 为什么需要 Fiber?
前端·react.js·源码阅读
野生技术架构师2 小时前
金三银四面试总结篇,汇总 Java 面试突击班后的面试小册
java·面试·职场和发展
AI攻城狮2 小时前
国产大模型能力大比拼,社区有话说
前端
小袁拒绝摆烂2 小时前
多表关联大平层转JSON树形结构
java·json
IT_陈寒2 小时前
Vite的public文件夹放静态资源?这坑我替你踩了
前端·人工智能·后端