HIVE数据类型
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<data_type>
Map:MAP<primitive_type, data_type>
Struct: STRUCT<col_name : data_type [COMMENT col_comment], ...>
Union:UNIONTYPE<data_type, data_type, ...>
建表
create table uniontab(arr array<string>, mp MAP<INT, string>, stru struct<name:string, age:int>, uni uniontype<int, double, string>) row format delimited fields terminated by ',' collection items terminated by '#' map keys terminated by ':' lines terminated by '\n'; hive> desc uniontab; OK arr array<string> mp map<int,string> stru struct<name:string,age:int> uni uniontype<int,double,string> 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"}
转化关系表
相关推荐
archive 2020-07-30
成长之路 2020-07-28
eternityzzy 2020-07-19
taisenki 2020-07-05
tugangkai 2020-07-05
SignalDu 2020-07-05
zlsdmx 2020-07-05
tomson 2020-07-05
tugangkai 2020-07-04
tomson 2020-07-05
Zhangdragonfly 2020-06-28
genshengxiao 2020-06-26
成长之路 2020-06-26
tomson 2020-06-26
蜗牛之窝 2020-06-26
成长之路 2020-06-25