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

在建表的时候我们常将日期字段设置为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;

运行结果

dtab
201807012018-07-012018-07-01
201807152018-07-152018-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;

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

更多

    原文作者:cxuan
    原文地址: https://www.jianshu.com/p/f68215cd409a
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞