大数据开发实践沉淀一

135 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第1天,点击查看活动详情

今天要着重盘一盘hive的日期函数,因为在日常的数据需求开发过程中,实在遇到太多对时间处理的指标了。所以在这里集中详细讲解几种常见的时间处理方法,这也是一个系列篇,下面就进入正题吧。

首先第一个要讲的是【时间格式的互相转换】

在实际的数据需求开发过程中,遇到很多跟时间、日期相关的处理,所以总结一下不同时间格式的转换。

注意:在格式转换过程中一定要注意所用函数的入参格式,以及输出结果的格式。

要求:输入的时间为20220202121212000000,格式为string,要求获得这个时间的上个月的最后一天。

当然你也可以用任意的时间格式和长度输入,因为套用下面这段代码,可以解决所有格式和长度的时间转换啦。

只要一段代码搞定就是下面这样子:


concat(date_format(last_day(add_months(from_unixtime(unix_timestamp(cast(substr('yyyyMMddHHmmss000000',1,8) as string),'yyyyMMdd'),'yyyy-MM-dd'),-1)),'yyyyMMdd'),'000000')

分段解析:


substr('${-1d_pt}',1,8)  -- 截取第一位到第八位的内容,这里的输入参数也可以是直接获取当天的日期,使用current_date即可。
要注意获取的当天日期格式是yyyyMMdd还是yyyy-MM-dd

cast(substr('${-1d_pt}',1,8) as string  -- 将日期转换格式为string

核心部分来了


unix_timestamp(cast(substr('${-1d_pt}',1,8) as string),'yyyyMMdd') -- 转换为时间戳,入参是string,获得的结果格式为bigint,注意此处得到的是一个时间戳格式的日期。
​
需要转换的格式如下,注意大小写不能写错,yyyy-MM-dd HH:mm:ss,小写的hh是12小时的写法,大写的HH24小时的写法
这一步是在各种需求中的时间处理都很常用的,一定要记住。

from_unixtime(unix_timestamp(cast(substr('${-1d_pt}',1,8) as string),'yyyyMMdd'),'yyyy-MM-dd')-- 再将时间戳转回来,入参的格式为bigint,获得的结果格式为时间