HIVE中数据类型分为数值类型、字符串类型、日期类型、复合类型以及其他类型。下面分别进行介绍。
数值类型(7种)
数值类型类似于JAVA中的基本数据类型
- 整型数值默认按照INT处理,浮点数值默认按照DOUBLE处理。
- 特殊情况:整型数值超出INT范围、数值后加Y/S/L后缀时,发生向其他整型类型的转换
- Hive-0.11.0和Hive-0.12.0固定了DECIMAL类型的精度并限制为38位数字,从Hive-0.13.0开始可以指定DECIMAL的规模和精度,当使用DECIMAL类型创建表时可以使用DECIMAL(precision,scale)语法。DECIMAL默认为DECIMAL(10,0)。 DECIMAL类型比DOUBLE类型为浮点数提供了精确的数值和更广的范围,DECIMAL类型存储了数值的精确地表示,而DOUBLE类型存储了非常接近数值的近似值。当DOUBLE类型的近似值精度不够时可以使用DECIMAL类型,比如金融应用,等于和不等于检查以及舍入操作,当数值超出了DOUBLE类型的范围(< -10^308 or > 10^308)或者非常接近于0(-10^-308 < ... < 10^-308)时,也可以使用DECIMAL类型。
字符串类型
- 字符串常量使用单引号或者双引号表示.VARCHAR的长度指示器范围为1~65535,如果值长度超过定义长度,该字符串会被自动截断。
- CHAR的长度是固定的,不足部分使用空格补足。CHAR的长度指示器范围为1~255
日期类型
- HIVE中提供DATE类型描述年月日,格式为yyyy-MM-dd。 范围为0000.01.01~9999.12.31。
- HIVE中提供TIMESTAMP类型描述细致时间类型,格式yyyy-MM-dd HH:mm:ss.fffffffff, 小数后为九位,也就是说精度为纳秒级别。
hive> select * from ts;
OK
1 2018-08-21 11:12:13.1
2 2018-08-21 11:12:13.123
3 2018-08-21 11:12:13.123456
4 2018-08-21 11:12:13.123456789
5 2018-08-21 11:12:13
6 NULL
如果load数据中的精度超出,则为null, 但使用cast由string向timestamp转换只是会截取到最大精度,而不会为null。比如:
6,2019-09-09 09:09:09.1234567891
类型转换
- 我的文件内容
1,2018-08-21 11:12:13.1,2018-08-21,2018-08-21 11:12:13.1
4,2018-08-21 11:12:13.123456789,2018-08-21,2018-08-21 11:12:13.123456789
5,2018-08-21 11:12:13,2018-08-21,2018-08-21 11:12:13
6,2019-09-09 09:09:09.1234567891,2018-08-21,2019-09-09 09:09:09.1234567891
- 我的ts表
hive> desc ts;
OK
id int
ts timestamp
date date
dstring string
Time taken: 0.062 seconds, Fetched: 4 row(s)
- load data后表内容
hive> select * from ts;
OK
1 2018-08-21 11:12:13.1 2018-08-21 2018-08-21 11:12:13.1
4 2018-08-21 11:12:13.123456789 2018-08-21 2018-08-21 11:12:13.123456789
5 2018-08-21 11:12:13 2018-08-21 2018-08-21 11:12:13
6 NULL 2018-08-21 2019-09-09 09:09:09.1234567891
Time taken: 0.054 seconds, Fetched: 4 row(s)
timestamp -> string
select cast(ts as String) from ts;
2018-08-21 11:12:13.1
2018-08-21 11:12:13.123456789
2018-08-21 11:12:13
NULL
timestamp -> date
select cast(ts as date) from ts;
2018-08-21
2018-08-21
2018-08-21
NULL
date -> string
select cast(date as string) from ts;
2018-08-21
2018-08-21
2018-08-21
2018-08-21
date -> timestamp
select cast(date as timestamp) from ts;
2018-08-21 00:00:00
2018-08-21 00:00:00
2018-08-21 00:00:00
2018-08-21 00:00:00
string -> timestamp
select cast(dstring as timestamp) from ts;
2018-08-21 11:12:13.1
2018-08-21 11:12:13.123456789
2018-08-21 11:12:13
2019-09-09 09:09:09.123456789
string -> date
select cast(dstring as date) from ts;
2018-08-21
2018-08-21
2018-08-21
2019-09-09
复合类型
Array:ARRAY
Map:MAP
Struct: STRUCT
Union:UNIONTYPE
建表
create table uniontab(arr array, mp MAP, stru struct, uni uniontype) row format delimited fields terminated by ',' collection items terminated by '#' map keys terminated by ':' lines terminated by '\n';
hive> desc uniontab;
OK
arr array
mp map
stru struct
uni uniontype
Time taken: 0.073 seconds, Fetched: 4 row(s)
生成数据
插入union时使用create_union,其中第一个位置,指定使用的类型的index(从0开始),后面跟一个完整的union类型的数据结构
insert into uniontab select array('d','e','f'), map(1,'zjx',2,'wly'), named_struct('name', 'wly', 'age', 17), create_union(2, 10, 10.0, '10.1') from ts limit 1;
select * from uniontab;
["a","b","c"] {1:"zjx",2:"wly"} {"name":"zjx","age":18} {0:10}
["d","e","f"] {1:"zjx",2:"wly"} {"name":"wly","age":17} {1:10.0}
["d","e","f"] {1:"zjx",2:"wly"} {"name":"wly","age":17} {2:"10.1"}
查询
struct类型相当于JAVA中的BEAN,可以使用 “.” 来操作其中的属性
select stru.age from uniontab;
18
17
17
select mp[1] from uniontab;
zjx
zjx
zjx
select uni from uniontab;
{0:10}
{1:10.0}
{2:"10.1"}
转化关系表