Apache Hive数据类型详解

Hive数据类型详解

注:本次用于做各种测试实验的Hive版本是1.2.1

作者: 强哥
邮箱:[email protected]

本次参考的Apache Hive网站如下:
https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Types

本文档的日期/时间类型、布尔类型、二进制类型、复杂数据类型都是经过实验测试验证,可作为用户使用Hive数据类型的参考资料。
1.基本数据类型
Hive基本数据类型包括:
数值型–存放正负数和浮点数
日期/时间型–存放时间值
字符型–将字符和数字存放在字符串中
布尔型–True或False
二进制型–二进制数的可变长数组

1.1数值型 Numeric Types
数据类型 字节长度 范围
TINYINT 单整型1个字节 -128 to 127
SMALLINT 单整型2个字节 -32,768 to 32,767
INT/INTEGER 单整型4个字节 -2,147,483,648 to 2,147,483,647
BIGINT 单整型8个字节 -9,223,372,036,854,775,808 to
9,223,372,036,854,775,807
FLOAT 单精度浮点数4个字节
DOUBLE 双精度浮点数8个字节
DOUBLE PRECISION DOUBLE的别名 Hive2.2.0版本添加
DECIMAL 38个数字的精度 Hive0.13.0版本可自定义精度和范围
NUMERIC 与DECIMAL相同 Hive3.0.0版本添加

1.2日期/时间型 Date/Time Types
数据类型 字节长度 范围
TIMESTAMP 单整型1个字节 Hive0.8.0版本添加
DATE 单整型2个字节 Hive0.12.0版本添加
INTERVAL 单整型4个字节 Hive1.2.0版本添加

TIMESTAMP 支持可选纳秒精度的传统UNIX时间戳
在txt文件中必须使用yyyy-mm-dd hh:mm:ss[.f…]. 这样的格式。如果是其他格式,可以使用INT、FLOAT、STRING数据类型来存放。
create table srcdb.cq_timestamp(custno int,cust_timestamp timestamp);
可以直接插入时间戳值
0: jdbc:hive2://192.168.8.66:10000> insert into srcdb.cq_timestamp values (1001,‘1979-01-01 12:30:30.123456’);
insert into srcdb.cq_timestamp values (1001,‘1979-01-01 12:30:30.123456’);
insert into srcdb.cq_timestamp values (1001,‘1979/11/11 11:11:11.123456’);
insert into srcdb.cq_timestamp values (1001,‘19791212 12:12:12’);
insert into srcdb.cq_timestamp values (1001,‘1979-01-02 12:30:59’);
insert into srcdb.cq_timestamp values (1001,‘1979-01-03’);
查询结果如下:

可以看出timestamp的插入只支持yyyy-mm-dd hh:mm:ss[.f…]格式,其他格式串插入都会变成NULL。

DATE只存放年月日, 格式为YYYY-MM-DD,日期范围为0000-01-01 to 9999-12-31
create table srcdb.cq_date(custno int,cust_date date);
insert into srcdb.cq_date values (1001,‘1979-01-01’);
insert into srcdb.cq_date values (1001,‘1979/01/02’);
insert into srcdb.cq_date values (1001,‘19790103’);
查询结果如下:

可以看出date类型也只支持yyy-mm-dd格式

扫描二维码关注公众号,回复: 5533449 查看本文章

INTERVAL 时间间隔,
目前不支持直接在表中建INTERVAL类型列
create table srcdb.cq_interval(custno int,cust_interval interval); --会报错
cannot recognize input near ‘interval’

但支持create as 方式
create table cq_interval
as
select interval ‘1’ day as day_interval,
interval ‘1’ month as month_interval;
效果如下:

也可以通过如下方式插入值
insert into cq_interval select interval ‘2’ day as day_interval, interval ‘2’ month as month_interval;

Hive Interval能处理的时间间隔信息包括:
SECONDS / MINUTES / HOURS / DAYS / WEEKS / MONTHS / YEARS
Interval主要用于时间的加减计算处理
下面看一个例子:

通过例子可以看出,在1979-01-01的基础上可以通过减去6天获取到1978-12-26,也可以通过加上6天获取到1979-01-07。
Interval不但可以加减日期,也可以加减年份、月份、周、小时、分钟、秒。

另外date、timestamp数据类型可以与string类型互转,需要添加转换函数cast。
cast(date as date)、cast(timestamp as date)、cast(string as date)、cast(date as timestamp)、cast(date as string)
下面看例子:

正因为date、timestamp格式的固定,所以cast函数转换也十分的简单,不像关系数据库转换那么复杂。
当然Hive还支持to_date、year、month、weekofyear、day、hour、minute、second、datediff、date_add、date_sub等日期处理函数。关于这些函数的使用,国内网站随时能查到信息,所以本篇不再累述。

本篇只对获取UNIX时间戳等进行简单的说明。看示例:

其中unix_timestamp() 函数是获取当前UNIX时间戳,是一个10位数字的字符串。
from_unixtime()是转换为具体格式日期的函数
unix_timestamp(date[,string pattern])是通过指定格式转换为UNIX时间戳的函数。
1.3字符型 String Types
数据类型 字节长度 范围
STRING 无长度限制 单引号、双引号均支持
CHAR 最长255字节 定长
VARCHAR 最长65535字节 变长1 to 65535

注:因为官方文档并未明确提到过,STRING支持最大范围可能是2GB,默认最大可能是32KB。
1.4布尔型 Boolean Types
布尔类型只包括两个值true 和false
create table srcdb.cq_boolean (custno int,cust_bool boolean);
insert into srcdb.cq_boolean values (1001,true);
insert into srcdb.cq_boolean values (1001,0);

注:输入任何数字,包括1、-1、0得到的布尔值结果都是true,所以在使用布尔值插入时请使用true和false。

1.5二进制型 Binary Types

create table srcdb.cq_binary(custno int,custname string,cust_bin binary);
insert into srcdb.cq_binary values(1001,‘xiaoxiao’,‘test’);
insert into srcdb.cq_binary values(1002,‘haha’,74657374);

通过查询来看,binary数据类型存储的值就是输入的值。
从Apache Hive官网也没有查询到Binary的相关用法。
Binary最大byte支持可能是2GB。

Binary数据类型的用途可能是:
Binary type in Hive will map to ‘binary’ data type in thrift.
Primitive java object for ‘binary’ type is ByteArrayRef
PrimitiveWritableObject for ‘binary’ type is BytesWritable

2.复杂数据类型

2.1结构体类型Struct Type
结构体类型可以存放多个不同基本数据类型的字段
create table srcdb.cq_test_struct
(
custno int ,
custname string,
addr struct<
CITY:STRING,
STREET:STRING,
HOUSENO:STRING,
ZIPCODE:INT>
) row format delimited fields terminated by ‘|’;

insert into srcdb.struct_dummy values (‘成都市’,‘育苗路12号’,‘303室’,629008); --注:直接插入后,中文可能是乱码,建议使用文件导入方式来做。
insert into srcdb.struct_dummy values (‘chengdu’,‘yumiaolu’,‘303room’,629008);
select * from srcdb.struct_dummy;

insert into srcdb.cq_test_struct select 1001 as custno,‘xiaoxiao’ as custname,
NAMED_STRUCT(‘CITY’,tb.CITY,‘STREET’,tb.STREET,‘HOUSENO’,tb.HOUSENO,‘ZIPCODE’,tb.ZIPCODE) as addr
from struct_dummy tb;

虽然可以插入数据,但我们还是要看下文件的格式

[root@linux6 ~]# hdfs dfs -cat hdfs://192.168.8.66:9000/data/srcdb.db/cq_test_struct/00*
1001|xiaoxiao|成都市金牛区100号629008
1001|xiaoxiao|四川自贡市彩灯公园18号3楼18室455666

用vim打开是这种^B格式,
1001|xiaoxiao|成都市B金牛区B100号^B629008
1001|xiaoxiao|四川自贡市B彩灯公园18号B3楼18室^B455666

所以我们自定义分隔符,将上面的srcdb.cq_test_struct 表结构改下

create table srcdb.cq_test_struct
(
custno int ,
custname string,
addr struct<
CITY:STRING,
STREET:STRING,
HOUSENO:STRING,
ZIPCODE:INT>
) row format delimited fields terminated by ‘|’
collection items terminated by ‘@’;

insert into srcdb.cq_test_struct select 1001 as custno,‘xiaoxiao’ as custname,
NAMED_STRUCT(‘CITY’,tb.CITY,‘STREET’,tb.STREET,‘HOUSENO’,tb.HOUSENO,‘ZIPCODE’,tb.ZIPCODE) as addr
from srcdb.struct_dummy tb where tb.zipcode=629008 limit 1;

insert into srcdb.cq_test_struct select 1002 as custno,‘xiaoxiao’ as custname,
NAMED_STRUCT(‘CITY’,tb.CITY,‘STREET’,tb.STREET,‘HOUSENO’,tb.HOUSENO,‘ZIPCODE’,tb.ZIPCODE) as addr
from srcdb.struct_dummy tb where tb.zipcode=455666 limit 1;

再查看的时候,发现struct列的分隔符已经变成@符号了

如果要查询结构体中的成员,可以使用structname.membername 来表示

2.2数组类型Array Type
数组用于存放相同类型的元素,元素个数不定。
create table srcdb.cq_test_array
(
custno int ,
custname string,
AliasName ARRAY
)row format delimited fields terminated by ‘|’
collection items terminated by ‘@’;

insert into srcdb.cq_test_array select 1001,‘xiaoxiao’,array(‘李四’,‘张小三’,‘张三儿’) from srcdb.struct_dummy limit 1;

我们使用类似的格式创建一个本地文件
vi test4.txt
1001|张三|张三娃@张小三@张三儿
1002|李四|小李@李二蛋@小李子
1003|王程程|王老五@王小丫@小王

[root@linux6 ~]# hdfs dfs -put test4.txt hdfs://192.168.8.66:9000/data/srcdb.db/cq_test_array/
再查询的时候,发现记录已经增多了。

数组类型可以用arrayname[下标] 来查询数组元素值。

2.3映射类型Map Type
Map用于存放键值对
create table srcdb.cq_test_map
(
custno int ,
custname string,
product MAP<string,int>
)row format delimited fields terminated by ‘|’
collection items terminated by ‘@’
map keys terminated by ‘:’;

insert into srcdb.cq_test_map select 1001,‘xiaoxiao’,map(‘中江挂面’,10) from srcdb.struct_dummy limit 1;

[root@linux6 ~]# hdfs dfs -cat hdfs://192.168.8.66:9000/data/srcdb.db/cq_test_map/000000_0
1001|xiaoxiao|中江挂面:10
因此,我们也可以创建本地文件

[root@linux6 ~]# hdfs dfs -put test5.txt hdfs://192.168.8.66:9000/data/srcdb.db/cq_test_map

也可以通过mapname[key]方式获取对应键的值

上面的例子还不能更好的展现map的使用用途
insert into srcdb.cq_map select 1001,‘xiaoxiao’,map(‘语文’,90,‘数学’,100,‘英语’,95) from srcdb.struct_dummy limit 1;
insert into srcdb.cq_map select 1002,‘wanwan’,map(‘语文’,99,‘数学’,100,‘英语’,100) from srcdb.struct_dummy limit 1;
insert into srcdb.cq_map select 1003,‘hanhan’,map(‘语文’,95,‘数学’,95,‘英语’,100) from srcdb.struct_dummy limit 1;

咱们假设该map字段存放的是学生成绩,如果要统计学生的总成绩和平均成绩怎么办?

2.4联合类型UnionType

uniontype是基本类型、array、map、struct的任意组合类型

本例是基本类型的一个组合
create table srcdb.cq_test_uniontype
(
custno int ,
custname string,
contact UNIONTYPE<int,string>
)row format delimited fields terminated by ‘|’
collection items terminated by ‘@’;

insert into srcdb.cq_test_uniontype select 1001,‘xiaoxiao’,create_union(1,138,‘[email protected]’) from srcdb.struct_dummy limit 1;
insert into srcdb.cq_test_uniontype select 1002,‘xiaoxiao’,create_union(1,225,‘[email protected]’) from srcdb.struct_dummy limit 1;

create table srcdb.cq_test_uniontype2
(
custno int ,
custname string,
contact UNIONTYPE<string,string,string>
)row format delimited fields terminated by ‘|’
collection items terminated by ‘@’;
insert into srcdb.cq_test_uniontype2 select 1001,‘xiaoxiao’,create_union(0,‘13881994190’,‘[email protected]’,‘510902198801012345’) from srcdb.struct_dummy limit 1;
insert into srcdb.cq_test_uniontype2 select 1001,‘xiaoxiao’,create_union(1,‘13881994190’,‘[email protected]’,‘510902198801012345’) from srcdb.struct_dummy limit 1;
insert into srcdb.cq_test_uniontype2 select 1001,‘xiaoxiao’,create_union(2,‘13547779214’,‘[email protected]’,‘510902201201023789’) from srcdb.struct_dummy limit 1;

这里的0,1,2是标签的意思,通过查询结果,我们了解到标签类似于数组的下标。当标签=0时,取值第一个串 13881994190,当标签=1时,取值第二个串[email protected]

文本文件中显示的数据恰好和刚才查询出来的数据吻合。
注: 关于uniontype数据类型,Apache Hive官网给的资料较少,目前还不清楚如何通过SQL将uniontype中的值进行拆分。

注:由于很多图片无法快速、顺利的粘贴到网页中。读者如果想看原始文档,请到百度文库中搜索
Apache Hive数据类型讲解 PDF文档。

猜你喜欢

转载自blog.csdn.net/cq2009_123nihao/article/details/88553500
今日推荐