hive decimal精度_大数据之数据仓库,使用Hive仓库遇到的哪些事

刚毕业那会用过hive,后面就很少使用hive,对hive只停留在Hql查询的操作中。最近,在建设数据仓库的过程中,频繁使用的Hive库,作为一个热爱学习技术的程序猿,当然要第一时间重拾Hive仓库了。对着镜子,看着越来越稀少的头发,趁着还有两根头发的时间,赶紧学习学习Hive,就让Hive祭奠我那逝去的头发吧。

周一,早晨刚到公司,凳子还没坐热,领导就把我叫到办公室,外面数据组的童鞋们,伸着头往里看。进了办公室,轻轻把门关上,跟领导汇报了上周的工作进度,讨论了未来工作计划,我拿着小一本本一个字、一个字的都记下来。最后,领导要求要尽快完成任务,咱们不能辜负老板的期待。

我故作深沉地从办公室走了出来,回到工位以后,数据组的童鞋们,七嘴八舌的谈论了起来。

“瞧,小明又挨训了”。我也不答,对着需求说:“需求大佬,来咱俩对对需求”。

有人大嚷到:“小明,是不是又写BUG了”。我瞪大了眼睛,“你怎么这样凭空污人清白……”。

“什么清白,我今早亲眼看到数据格式不正确”。

”我当时便涨红了脸,额上的青筋条条绽出,争辩道,“程序出BUG不能算写BUG……出BUG!

此处省略一堆废话。

b03868e34b4ca37e148abb52c6e01045.png

严格来说的确是出了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支持哪些数据类型,才能更好的开展工作。

基本类型

b305bf8c29b38f305e0dc7a6ada89b32.png

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。

6b3e26612b3548904f2f15677dff98ef.png

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;

c5a090f9645e078c8c63efce1c225e36.png

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复杂数据类型。

往期回顾


|| 大数据,阿里大数据实践,数据仓库一些概念

|| 大数据 Hive 类Sql语法大全,Hql Join语法详解

|| Hive Sql最常用的时间处理类,都在这里了

d16a4e3984e9a1b3de9df68ceaaeee8a.png

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值