Hive 数据类型
Hive 支持关系型数据库的绝大多数基本数据类型,同时也支持 4 种集合数据类型。
# 数据类型
有关数据类型的详细描述参见官网 (opens new window)
# 基本数据类型
数据类型 | 描述 |
---|---|
TINYINT | 1 byte,有符号整数,-128 ~ 127 |
SMALINT | 2 byte,有符号整数,-32768 to 32767 |
INT/INTEGER | 4 byte, 有符号整数,-2147483648 ~ 2147483647 |
BIGINT | 8 byte,有符号整数,-9223372036854775808 ~ 9223372036854775807 |
FLOAT | 4 byte,单精度浮点数 |
DOUBLE | 8 byte,双精度浮点数 |
DECIMAL | Hive 中的 DECIMAL 类型基于 Java 的 BigDecimal,它用于表示 Java 中不可变的任意精度十进制数字 |
NUMERIC | 和 DECIMAL 类似,Hive 3.0.0 引入 |
TIMESTAMP | 时间戳,支持具有可选纳秒精度的传统 UNIX 时间戳 |
DATE | 日期,格式为 YYYY-MM-DD |
INTERVAL | 时间间隔 |
STRING | 字符串 |
VARCHAR | VARCHAR 与 STRING 类似,但是 STRING 存储变长的文本,对长度没有限制;varchar 长度上只允许在 1-65355 之间 |
CHAR | Char 类型类似于 Varchar,但 CHAR 是固定长度的,也就是说比指定长度值短的值空缺部分会用空格填充,但在比较期间尾随空格并不重要。最大长度固定为 255。 |
BOOLEAN | 布尔值 |
BINARY | 字节数组,对应 Java 中的 byte[]类型 |
# 隐式转换
Hive 的数据类型是可以进行隐式转换的,类似于 Java 的类型转换。如用户在查询中将一种浮点类型和另一种浮点类型的值做对比,Hive 会将类型转换成两个浮点类型中值较大的那个类型,即:将 FLOAT 类型转换成 DOUBLE 类型;当然如果需要的话,任意整型会转化成 DOUBLE 类型。总的来说数据转换遵循以下规律:
- 任何整数类型都可以隐式转换为一个范围更广的类型。tinyInt => int;int => bigint
- 所有整数类型、float、string(都是数字)都可以隐式转换为 Double
- tinyint、smallint、int => float
- boolean 不会转换
# 显式转换
使用cast
函数进行强制类型转换;如果强制类型转换失败,返回 NULL。
hive> select cast('aaa' as int);
OK
NULL
hive> select cast('123' as int);
OK
123
1
2
3
4
5
6
2
3
4
5
6
# 复杂数据类型
数据类型 | 描述 |
---|---|
ARRAY | 数组是一组具有相同类型和名称的变量的集合。这些变量称为数组的元素,每个数组元素都有一个编号,编号从零开始。例如,数组值为[‘John’, ‘Doe’],那么第 2 个元素可以通过数组名[1]进行引用 |
MAP | MAP 是一组键-值对元组集合,使用数组表示法可以访问数据。例如,如果某个列的数据类型是 MAP,其中键->值对是’first’->’John’和’last’->’Doe’,那么可以通过字段名[‘last’]获取最后一个元素 |
STRUCT | 和 c 语言中的 struct 类似,都可以通过“点”符号访问元素内容。例如,如果某个列的数据类型是 STRUCT{first STRING,last STRING},那么第 1 个元素可以通过字段.first 来引用 |
UNIONTYPE | Hive 0.7.0 中引入了 UNIONTYPE 数据类型,但是在 Hive 中对此类型的完全支持仍然不完整 |
Array:
select array(1,2,3);
-- 使用 [] 访问数组元素
select arr[0] from (select array(1,2,3) arr) tmp
1
2
3
4
2
3
4
Map:
select map('a', 1, 'b', 2, 'c', 3);
-- 使用 [] 访问map元素
select mymap["a"] from (select map('a', 1, 'b', 2, 'c', 3) as mymap) tmp;
-- 使用 [] 访问map元素。 key 不存在返回 NULL
select mymap["x"] from (select map('a', 1, 'b', 2, 'c',3) as mymap) tmp;
1
2
3
4
5
6
7
2
3
4
5
6
7
Struct:
select named_struct("name", "username1", "id", 7, "salary", 12880.68);
-- 使用 列名.字段名 访问具体信息
select userinfo.id from (select named_struct("name", "username1", "id", 7, "salary", 12880.68) userinfo) tmp;
1
2
3
4
2
3
4
UnionType:
select create_union(0, "zhansan", 19, 8000.88) uinfo;
1
上次更新: 2023/11/01, 03:11:44