上一篇
hive一般存储什么数据类型
- 行业动态
- 2025-05-12
- 10
Hive主要存储结构化和半结构化数据,支持基础数据类型(INT/DOUBLE/STRING等)、复杂类型(ARRAY/STRUCT/MAP)、时间类型(DATE/TIMESTAMP)及二进制数据,适用于大规模离线数据分析
基础数据类型
类型分类 | 具体类型 | 说明 | 典型场景 |
---|---|---|---|
数值型 | TINYINT/SMALLINT/INT/BIGINT FLOAT/DOUBLE/DECIMAL | TINYINT(1字节)、SMALLINT(2字节)、INT(4字节)、BIGINT(8字节) FLOAT(单精度浮点)、DOUBLE(双精度浮点) DECIMAL(高精度定点数,需指定精度) | 用户ID(BIGINT)、传感器读数(DOUBLE)、金融计算(DECIMAL(18,4)) |
布尔型 | BOOLEAN | 取值TRUE/FALSE | 状态标识(如交易成功/失败) |
字符串型 | STRING | 变长字符序列,UTF-8编码 | 日志文本、JSON片段 |
时间型 | TIMESTAMP | 精确到纳秒的时间戳 | 事件时间记录(如2023-05-20 14:30:45.123456789) |
复杂数据类型
ARRAY(数组)
- 定义:
ARRAY<DATA_TYPE>
- 特性:有序集合,元素类型一致
- 示例:
ARRAY<STRING>
可存储[“hadoop”,”spark”,”flink”] - 应用:同一字段的多值存储(如用户标签列表)
MAPREX(映射)
- 定义:
MAP<KEY_TYPE, VALUE_TYPE>
- 特性:键值对集合,键唯一
- 示例:
MAP<STRING, INT>
可存储{“age”:30, “score”:85} - 应用:配置项存储(如{“max_threads”:10, “timeout”:100})
STRUCT(结构体)
- 定义:
STRUCT<field_name: DATA_TYPE, ...>
- 特性:类似数据库记录,字段命名
- 示例:
STRUCT<name:STRING, age:INT>
- 应用:嵌套对象存储(如用户信息+地址信息)
JSON(原生JSON)
- 定义:
JSON<...>
(Hive 3.0+) - 特性:自动解析JSON文档为Struct
- 示例:存储
{"user":{"id":1001,"role":"admin"}}
- 优势:无需预定义Schema,支持模式演进
特殊处理机制
动态分区插入
分区字段需显式声明类型(如PARTITION (dt STRING)
),但允许按目录结构自动创建分区。Schema Evolution(模式演进)
- 添加字段:新字段默认允许NULL
- 字段类型变更:需兼容(如INT→BIGINT,禁止DOUBLE→INT)
- 删除字段:需设置
TBLPROPERTIES ('skip.delete.column'='true')
SerDe选择
- LazySimpleSerDe:字符串类型自动推断分隔符
- JsonSerDe:解析JSON字段(需指定
ROW FORMAT SerDe
) - RegexSerDe:正则表达式解析日志文件
类型选择建议
场景需求 | 推荐类型 | 原因 |
---|---|---|
海量ID存储 | BIGINT | 8字节节省空间,支持范围-9223372036854775808~9223372036854775807 |
精确小数计算 | DECIMAL(18,4) | 避免浮点误差,适合金融计算 |
半结构化日志 | STRUCT<…> | 通过json_tuple 函数解析JSON字段 |
多值属性存储 | ARRAY | 如订单商品列表、用户兴趣标签 |
跨系统兼容性
源系统 | Hive类型 | 转换规则 |
---|---|---|
MySQL INT | Hive INT | 直接映射 |
Java Date | Hive TIMESTAMP | 需格式化为yyyy-MM-dd HH:mm:ss |
Oracle CLOB | Hive STRING | 注意字符编码(建议UTF-8) |
Protobuf Message | STRUCT + BINARY | 需自定义SerDe解析二进制协议 |
FAQs
Q1:Hive的STRING类型最多能存多少数据?
A1:理论上仅受HDFS块大小限制(默认128MB),但实际使用需考虑:
- Yarn容器内存限制(建议单行<10MB)
- Map端排序时的内存消耗
- 可通过
set mapreduce.map.memory.mb=4096
调整内存配置
Q2:如何判断是否该用ARRAY还是MAP?
A2:选择依据对比:
| 特性 | ARRAY | MAP |
|————-|———————-|———————-|
| 数据特征 | 有序集合 | 无序键值对 |
| 唯一性 | 允许重复元素 | Key必须唯一 |
| 访问方式 | 索引访问([0],[1]) | Key查找([‘key’]) |
| 适用场景 | 同类型多值(如标签) | 配置