直接展示:

复杂数据类型 简单介绍 定义格式(建表语法)
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. 使用注意事项

  1. 所有元素必须是同一数据类型
  2. 下标越界不会报错,返回 NULL
  3. 加载数据时必须指定 COLLECTION ITEMS TERMINATED BY
  4. 大量数据 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. 使用注意事项

  1. key 必须是基本类型(string/int 等),不能是复杂类型
  2. key 重复时,只保留最后一个
  3. 查询不存在的 key 返回 NULL,不报错
  4. 建表时必须指定 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. 使用注意事项

  1. 字段名和类型在建表时固定,不可动态扩展
  2. 结构清晰,可读性优于 Map,但灵活性差
  3. 不支持 explode 炸开整个 struct
  4. 嵌套层级不宜过深,否则影响维护与性能

四、三者对比与实战经验

表格

类型 适用场景 访问方式 灵活性
ARRAY 有序列表、多值同类型属性 下标 []
MAP 动态键值、不确定字段 key []
STRUCT 固定结构对象 .字段名 低,最规范

通用注意事项(五年经验总结)

  1. 复杂类型尽量不要多层嵌套(如 array<map<string,struct<...>>>),可读性极差且易出问题
  2. 使用 explode 时注意数据倾斜与行数爆炸
  3. 数仓建模中,能用 struct 就尽量不用 map,更规范易维护
  4. 文本导入时分隔符必须统一,避免乱码、错位
  5. 复杂类型字段不建议作为分区 / 分桶字段
Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐