美文网首页Hive在简书
【Hive】日期从整形转为Date类型

【Hive】日期从整形转为Date类型

作者: cxuan | 来源:发表于2018-07-28 10:04 被阅读69次

在建表的时候我们常将日期字段设置为INT类型,将诸如20180601这样的数字值来表示日期,这样在做日期比较等操作时没有问题,但是要进行某些日期计算,就要先转成日期类型才能进行计算了,怎么转换呢?

数据准备

下面在Hive中先建一个表,含有一个INT类型的日期字段,插入两行数据。

create table tb (dt INT);
insert into tb values (20180701);
insert into tb values (20180715);

转换类型

这里第一种方法是将INT类型的日期值转成STRING类型,用Hive内置的unix_timestamp函数转成时间戳类型,最后将时间戳用from_unixtime转成yyyy-MM-dd的日期类型。

第二种就比较直接,将INT类型的日期值转成STRING类型,再对字符串进行截取处理,用-拼接起来。

select dt,
from_unixtime(unix_timestamp(cast(dt as string),'yyyyMMdd'),'yyyy-MM-dd') as a,
concat(substr(cast(dt as string),1,4), '-',substr(cast(dt as string),5,2), '-',substr(cast(dt as string),7,2)) as b
from tb;

运行结果

dt a b
20180701 2018-07-01 2018-07-01
20180715 2018-07-15 2018-07-15

当然,每次都这样写有些费劲,可以在Hive中创建UDF或者宏,转换时进行调用就好了。

创建宏命令

宏命令相对于UDF要简单方便些,但是宏只能是临时宏,只在本次会话中可见、有效。因此你需要将宏脚本放在SQL脚本的头部

DROP TEMPORARY MACRO IF EXISTS date_trans;
CREATE TEMPORARY MACRO date_trans(dt int)
    if(dt is not null and length(dt)=8,
       concat(substr(cast(dt as string),1,4), '-',substr(cast(dt as string),5,2), '-',substr(cast(dt as string),7,2)), 
       null);

--调用
select dt,date_trans(dt) as a from tb;

如果同一个功能的函数或宏命令被多次调用,那维护起来就很方便,语句也简洁很多。

更多

相关文章

网友评论

    本文标题:【Hive】日期从整形转为Date类型

    本文链接:https://www.haomeiwen.com/subject/qhznmftx.html