本篇文章我们梳理一下hive常用的函数,对于hive而言,常用的函数并不是特别多,往往记住关键几个,就可以解决80%的问题,这也是大家喜欢hive的原因,那么,常用的函数有哪些呢?
时间函数
1)时间格式转化
常用的日期格式主要有两个:时间戳和日期格式,时间戳便于计算,日期格式便于阅读,两者各有利弊,所以需要相互转换,转换的对应函数主要有:
from_unixtime(timestamp,dateformat):将时间戳转化为日期格式,格式必须是10位,毫秒级的时间戳需要用cast转化成秒级。unix_timestamp(date,dateformat):日期格式转化为时间戳,如果括号内没有参数则表示返回当前的时间戳。
例如:
时间戳转日期格式:
select from_unixtime(unix_timestamp(),'yyyy-MM-dd HH:mm:ss') as date_time, from_unixtime(1537924406,'yyyy-MM-dd') as date_time1from dual;
如果时间戳是毫秒级,则字段修改为:
from_unixtime(cast(unix_timestamp()/1000 as int),'yyyy-MM-dd HH:mm:ss') as date_time
日期格式转时间戳:
select unix_timestamp() as time_stamp, --返回当前时间戳; unix_timestamp('2018-09-26 9:13:26','yyyy-MM-ddHH:mm:ss') as time_stamp1from dual;
作为一个数据,在不同系统之间游走,有没有经常遇到时间格式不匹配的情况,所以需要做格式的转化:
date_format(string/date,dateformate):把字符串或者日期转成指定格式的日期。
日期格式调整:
select date_format('2018-09-12','yyyy-MM-dd HH:mm:ss') as date_time, date_format('2018-09-12','yyyyMMdd') as date_time1from dual;--2018-09-12 00:00:00
有没有发现一个问题,date_format只能从yyyy-MM-dd格式转化成其他格式,对于其他类型,例如:yyyyMMdd,则不能处理,所以需要灵活一点,将各个格式的时间转化成时间戳,再通过时间戳转化成其他格式:
select from_unixtime(unix_timestamp(substr('20191007000000',1,8),'yyyyMMdd'),'yyyy-MM-dd');
如此一来,各种格式都可以转化。
2)日期的加减差运算:
日期的加减是对日期格式数据的基本运算,常用的是时间差计算、加一天、减一天等。
时间差计算:
datediff(date,date1);日期差,即两个日期差几天。months_between(date,date1);两个日期差几个月,用法一致。select datediff('2015-05-22','2015-05-29') as date_ff; --[-7]
在原日期上加n天:
date_add:在现在日期上增加天数,
add_months是增加月份,用法一致。
select date_add('2015-05-22 15:34:23',2); --2015-05-24
在原日期上减n天:
date_sub:在现在日期上减少天数。
select date_sub('2015-05-22 15:34:23',2); --2015-05-20
3)时间截取:
如果我们获取到一个完整的时间,但是只想用其中的一部分,势必牵扯到时间截取的功能,常见的时间截取主要是如下几个函数:
to_date:获取完整时间中的日期部分:
select to_date('2015-06-01 15:34:23'); --2015-06-01
year:获取完整时间中的年份:
select year('2015-05-22 15:34:23'); --2015
month:获取完整时间中的月份:
select month('2015-05-22 15:34:23'); --5
day:获取完整时间中的日期:
select day('2015-05-22 15:34:23'); --22
4