一、背景介绍
在Hive中处理JSON数据时,get_json_object()函数虽然灵活,但存在重复解析性能差、多字段提取繁琐的问题。例如,提取10个字段需调用10次函数,导致计算资源浪费。为此,Hive提供了更高效的json_tuple()函数和LATERAL VIEW语法:
- json_tuple():单次解析即可提取多个字段,减少JSON重复解析开销。
- LATERAL VIEW:将JSON数组“扁平化”为多行数据,便于分析嵌套集合。
二、核心语法与功能对比
1. json_tuple()函数详解
json_tuple(json_string, 'key1', 'key2', ..., 'keyN')
参数 |
描述 |
json_string |
JSON格式的字符串(需为STRING类型) |
key1~keyN |
需提取的字段名(支持嵌套路径) |
特性 |
说明 |
单次解析多字段 |
一次函数调用提取多个字段,效率比多次get_json_object()高50%+ |
支持嵌套路径 |
可直接指定parent.child形式的路径(需Hive 2.3+) |
返回多列 |
输出为多列结构,无需后续字符串拆分 |
2. LATERAL VIEW语法详解
SELECT ...
FROM table_name
LATERAL VIEW [OUTER] explode(数组字段) 别名 AS 列名
参数 |
描述 |
OUTER |
可选,保留原数组中为空的行(防止数据丢失) |
explode() |
将数组拆分为多行 |
别名/列名 |
定义临时视图名称和输出列名 |
场景 |
示例 |
解析JSON数组 |
items字段包含商品列表 |
展开Map类型数据 |
tags字段为键值对集合 |
多层级数组嵌套 |
user.orders为多层订单数据 |
三、实战案例
案例1:json_tuple()多字段提取
数据示例(表user_profile,字段profile_data):
{