刚毕业那会用过hive,后面就很少使用hive,对hive只停留在Hql查询的操作中。最近,在建设数据仓库的过程中,频繁使用的Hive库,作为一个热爱学习技术的程序猿,当然要第一时间重拾Hive仓库了。对着镜子,看着越来越稀少的头发,趁着还有两根头发的时间,赶紧学习学习Hive,就让Hive祭奠我那逝去的头发吧。
周一,早晨刚到公司,凳子还没坐热,领导就把我叫到办公室,外面数据组的童鞋们,伸着头往里看。进了办公室,轻轻把门关上,跟领导汇报了上周的工作进度,讨论了未来工作计划,我拿着小一本本一个字、一个字的都记下来。最后,领导要求要尽快完成任务,咱们不能辜负老板的期待。
我故作深沉地从办公室走了出来,回到工位以后,数据组的童鞋们,七嘴八舌的谈论了起来。
“瞧,小明又挨训了”。我也不答,对着需求说:“需求大佬,来咱俩对对需求”。
有人大嚷到:“小明,是不是又写BUG了”。我瞪大了眼睛,“你怎么这样凭空污人清白……”。
“什么清白,我今早亲眼看到数据格式不正确”。
”我当时便涨红了脸,额上的青筋条条绽出,争辩道,“程序出BUG不能算写BUG……出BUG!
此处省略一堆废话。严格来说的确是出了BUG。
事情是这样的,我把Oracle数据库里的数据往HIve数据仓库迁移的过程中,忘记考虑字段类型了。在Oracle中的Date日期类型数据,在Hive中,我指定的类型依然是Date。这里犯了一个很严重的错误,Hive中的Date类只支持yyyy-MM-dd类型的日期,如2020-04-10这种日期。
而Oracle数据库中的日期是2020-04-10 20:32:22这种日期类型,存到hive中少了时分秒,日期数据丢掉了时分秒,少了精度。还好我发现的及时,而且数据仓库正在建设阶段,并没有投入生产使用。不过这次严重的错误也给自己上了一课,以后不能为了省事就把Oracle数据库表结构改改直接拿去建Hive库。
HIve数据库支持的数据类型都有哪些?
工欲善其事,必先利其器。先摸清了Hive支持哪些数据类型,才能更好的开展工作。
基本类型
Hive支持的基本数据类型咱们来看看这张表,Hive支持以上所有的基本数据类型。
1、数字类型
像这种 -2,147,483,648 ~ 2,147,483,647之间的整数类型,在使用中一般默认是int类型,除非你指定了格式100Y、100S、100L会自动转换为tinyint、smallint、bigint。
浮点数类型
浮点数默认会当作double型。
值得注意的是,Hive中的decimal类型基于Java中的BigDecimal,decimal不指定精度时默认为decimal(10,0)。
decimal这个类型很有意思,当你不指定精度的时候,他就默认精度为0,也就是小数点后0位。
比如我们选定一个数1.42,不指定精度的情况下,它在Hive中会四舍五入变成1;如果我们指定精度decimal(10,2),那么在hive中存入就是1.42。相信大家都懂什么意思了吧!decimal(10,2)表达的意思是,长10位,精度为2。
2、字符串类型
hive中的字符串类型分为String、Char、VarChar三种类型,咱们来看看他们的区别。
string:string类型可以用单引号 ' 或双引号 " 定义,就是我们常见的字符串类型
varchar :varchar类型由长度定义,范围为1-65355。如果存入的字符串长度超过了定义的长度,超出部分会被截断。尾部的空格也会作为字符串的一部分,影响字符串的比较,可变长。
char:char是固定长度的,最大长度255,它尾部的空格不影响字符串的比较,固定不可变。
其中char和varchar的区别:声明char[10]和varchar[10]两种数据类型,当存入的字符占用小于10时,声明为varchar的字符只占用10字节;而char则仍然占满20个字节空间,用空格填充。
--建一张表
create table v_char_test (
char_test1 char(4),
char_test2 char(5),
string_test1 string,
string_test2 string,
varchar_test1 varchar(4),
varchar_test2 varchar(6)
);
---插入数据
insert into char_a values('aa ','aa ','aaa ','aaa ','aaa ','aaa ');
--查询
select
char_test1=char_test2,
string_test1=string_test2,
varchar_testvarchar_test1=varchar_test2
from
v_char_test;
3、日期与时间戳
哇,重点终于来了,今天讲的重点就是这个,我就是没弄清Hive的Date类型才出了错误。
timestamp:timestamp表示UTC时间,可以是以秒为单位的整数;带精度的浮点数,最大精确到小数点后9位,纳秒级;timestamp格式的字符串 YYYY-MM-DD hh:mm:ss.fffffffff。
Date:Hive中的Date只支持YYYY-MM-DD格式的日期,其余写法都是错误的,如需带上时分秒,请使用timestamp。
咱们建个表来测试一下:
--数据类型为timestamp格式字段的表
create table timestamp_test (time timestamp);
--插入数据
insert into table timestamp_test values('2020-04-10 22:10:49.223');
--数据类型为date格式字段的表
create table date_test (time date);
--插入数据, 注意虽然插入数据命令没报错,但却没有将数据写入文件。
insert into table date_test values('2020-04-10 22:10:49.223');
--将日期覆盖插入的date_test , 成功插入数据
insert overwrite table date_dual values('2020-04-10');
既然讲到这里,咱们再来看看日期跟时间戳类型的其他骚操作:
当我想获取当前的timestamp,该如何获取呢?请你这样操作,获取当前timestamp:
current_timestamp() 返回结果: timestamp 时间
有的同学说,我想获取当前的日期,又该如何呢?请看这里,获取当前日期:
current_date() 返回结果:date 日期
然后,咱们再来看看怎么把timestamp/date/string 格式化为字符串:
date_format(date/timestamp/string ts, string fmt) 返回结果:字符串
下面来讲究Hive中的Unix时间戳:从1970-01-01 00:00:00 UTC到指定时间的秒数,例如:1530761302。
把 ”当前时间或时间字符串“ 转为 ”Unix时间戳“:
-获取当前timestamp的Unix时间戳
select unix_timestamp(current_timestamp);
--获取指定字符串的Unix时间戳
select unix_timestamp('2020-04-10 22:30:00');
把 ”Unix时间戳“ 转为 ”时间字符串“:
from_unixtime(bigint unixtime,[string format])
--unixtime:从1970-01-01 00:00:00 UTC到指定时间的秒数
--format:目标转换格式
--返回值: string
--例子
--转换成 yyyy-MM-dd HH:mm:ss timestamp时间戳
select from_unixtime(1530763124);
--转换成指定格式的字符串
select from_unixtime(1530763124, "yyyy-MM-dd");
总结:无论是什么数据库,只要掌握了其数据类型的使用方法,都会达到事半功倍的效果。明天继续分享一下,Hive复杂数据类型。
网友评论