Hive 复杂数据类型深度解密
·
直接展示:
| 复杂数据类型 | 简单介绍 | 定义格式(建表语法) |
|---|---|---|
| ARRAY | 有序、可重复的集合,下标从 0 开始,所有元素类型必须一致 | array<元素类型> |
| MAP | 键值对结构,key 唯一、value 可重复,key 与 value 类型固定 | map<key类型, value类型> |
| STRUCT | 结构体,可包含多个不同类型的字段,类似对象,支持 . 访问 |
struct<字段名:类型, 字段名:类型,...> |
| UNION | 多类型联合体,同一时间只存储一种指定类型的值,较少使用 | uniontype<类型1, 类型2,...> |
- Hive 复杂类型主要分为:数组、映射、结构体、联合体四类
- 日常数仓开发中最常用:ARRAY、MAP、STRUCT
- UNIONTYPE 语法复杂、场景有限,生产环境极少使用
一、ARRAY 类型
1. 定义与特点
- 有序、可重复的集合,元素类型统一
- 下标从 0 开始访问
- 常用于存储列表、标签、多值属性
2. 建表示例
sql
CREATE TABLE student_score (
id INT,
name STRING,
scores ARRAY<INT> -- 存储多科成绩
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
COLLECTION ITEMS TERMINATED BY '|'; -- 数组元素分隔符
3. 数据示例
plaintext
1,张三,85|92|78
2,李四,90|88|95
4. 查询示例
sql
-- 取第一个成绩
SELECT id, name, scores[0] FROM student_score;
-- 查看数组长度
SELECT id, size(scores) FROM student_score;
-- 炸开数组(行转列)
SELECT id, name, score FROM student_score LATERAL VIEW explode(scores) tmp AS score;
create table movie(
name string,
category array<string>
)
row format delimited
fields terminated by "\t"
collection items terminated by ",";
load data local inpath "/home/hivedata/movies.txt" into table movie;
5. 案例分析
表中的数据展示

select explode(category) from movie;
select name,c from movie lateral view explode(category) c_table as c;
6. 使用注意事项
- 所有元素必须是同一数据类型
- 下标越界不会报错,返回
NULL - 加载数据时必须指定
COLLECTION ITEMS TERMINATED BY - 大量数据
explode容易导致数据膨胀,注意性能
二、MAP 类型
1. 定义与特点
- key-value 结构,key 唯一、value 可重复
- 适合存储动态属性、键值配置、多维度标签
2. 建表示例
sql
CREATE TABLE user_info (
id INT,
name STRING,
info MAP<STRING, STRING> -- 性别、年龄、城市等动态信息
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
COLLECTION ITEMS TERMINATED BY '|'
MAP KEYS TERMINATED BY ':'; -- key与value分隔符
3. 数据示例
1,张三,age:20|gender:男|city:北京
2,李四,age:22|gender:女|city:上海
4. 查询示例
sql
-- 根据key取值
SELECT id, name, info['age'], info['city'] FROM user_info;
-- 查看所有key/value
SELECT id, map_keys(info), map_values(info) FROM user_info;
-- 炸开map
SELECT id, name, key, value
FROM user_info
LATERAL VIEW explode(info) tmp AS key, value;
5. 案例分析
6. 使用注意事项
- key 必须是基本类型(string/int 等),不能是复杂类型
- key 重复时,只保留最后一个
- 查询不存在的 key 返回
NULL,不报错 - 建表时必须指定
MAP KEYS TERMINATED BY
三、STRUCT 类型
1. 定义与特点
- 固定结构的 “对象”,包含多个不同类型字段
- 用
.字段名访问,清晰直观 - 适合固定结构的嵌套对象,如地址、设备信息等
2. 建表示例
sql
CREATE TABLE user_address (
id INT,
name STRING,
addr STRUCT<province:STRING, city:STRING, street:STRING>
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
COLLECTION ITEMS TERMINATED BY '|';
3. 数据示例
1,张三,广东省|深圳市|南山大道
2,李四,江苏省|南京市|中山路
4. 查询示例
sql
-- 直接用 . 访问
SELECT id, name, addr.province, addr.city FROM user_address;
-- 查看整个结构体
SELECT id, name, addr FROM user_address;
5. 使用注意事项
- 字段名和类型在建表时固定,不可动态扩展
- 结构清晰,可读性优于 Map,但灵活性差
- 不支持 explode 炸开整个 struct
- 嵌套层级不宜过深,否则影响维护与性能
四、三者对比与实战经验
表格
| 类型 | 适用场景 | 访问方式 | 灵活性 |
|---|---|---|---|
| ARRAY | 有序列表、多值同类型属性 | 下标 [] |
中 |
| MAP | 动态键值、不确定字段 | key [] |
高 |
| STRUCT | 固定结构对象 | .字段名 |
低,最规范 |
通用注意事项(五年经验总结)
- 复杂类型尽量不要多层嵌套(如 array<map<string,struct<...>>>),可读性极差且易出问题
- 使用
explode时注意数据倾斜与行数爆炸 - 数仓建模中,能用 struct 就尽量不用 map,更规范易维护
- 文本导入时分隔符必须统一,避免乱码、错位
- 复杂类型字段不建议作为分区 / 分桶字段
更多推荐




所有评论(0)