HIVE数据类型

HIVE中数据类型分为数值类型、字符串类型、日期类型、复合类型以及其他类型。下面分别进行介绍。

数值类型(7种)

数值类型类似于JAVA中的基本数据类型

HIVE数据类型

  • 整型数值默认按照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"}

转化关系表

HIVE数据类型

相关推荐