大家好,如果您还对hive时间函数不太了解,没有关系,今天就由本站为大家分享hive时间函数的知识,包括hive周函数的问题都会给大家分析到,还望可以解决大家的问题,下面我们就开始吧!
本文目录
一、hive6:字符串和日期的转换常用函数
用到from_unixtime和unix_timestamp两种函数:
from_unixtime:时间戳转日期函数
用法:from_unixtime(bigint unixtime[, stringformat])
substr(from_unixtime(unix_timestamp()),1,10)
select from_unixtime(unix_timestamp('20180905','yyyymmdd'),'yyyy-mm-dd')
select from_unixtime(unix_timestamp('2018-09-05','yyyy-mm-dd'),'yyyymmdd')
用法:unix_timestamp(string date)
注意:里面格式必须是yyyy-MM-dd HH:mm:ss,如果不是会返回null值
hive表中,存放着无法直接识别的字符串格式的时间,如'20170728102031',要计算两个时间相差的秒数。
1、先将字符串调整为hive可以识别的格式,即将形如'20170728102031'转成'2017-07-28 10:20:31'。因为hive的 regexp_replace不支持子语句,没法一次转换,只能用万能的 substr和拼接函数来写了
select concat(substr('20170728102031',1,4),'-',
substr('20170728102031',5,2),'-',
substr('20170728102031',7,2),'',
substr('20170728102031',9,2),':',
substr('20170728102031',11,2),':',
substr('20170728102031',13,2))
select unix_timestamp(concat(substr('20170728102031',1,4),'-',substr('20170728102031',5,2),'-',
substr('20170728102031',7,2),'',
substr('20170728102031',9,2),':',
substr('20170728102031',11,2),':',
substr('20170728102031',13,2)))- unix_timestamp(concat(substr('20170728112031',1,4),'-',
substr('20170728112031',5,2),'-',
substr('20170728112031',7,2),'',
substr('20170728112031',9,2),':',
substr('20170728112031',11,2),':',
substr('20170728112031',13,2)))
hive> select create_time,datediff(from_unixtime(unix_timestamp(),’yyyy-MM-dd HH:mm:ss’), create_time) from test;
结果:当前时间是2017-11-16与create_time的11-10之间差了6天,输出6;
hive>select datediff(’2012-12-08′,’2012-05-09′) from dual;
日期时间转日期函数: to_date语法: to_date(string timestamp)返回:string
hive> select to_date(’2011-12-08 10:03:01′) from dual;
以下可以取到 month,hour,minute,second用法和上面的一样
日期转周函数: weekofyear语法: weekofyear(string date)返回值: int说明:返回日期在当前的周数。
hive> select weekofyear(’2011-12-08 10:03:01′) from dual;
date_add(string startdate, int days)
说明:返回开始日期startdate增加days天后的日期
hive> select date_add(’2012-12-08′,10) from dual;
日期减少函数: date_sub语法: date_sub(string startdate, int days)
说明:返回开始日期startdate减少days天后的日期。
hive> select date_sub(’2012-12-08′,10) from dual;
所以我们利用其中的hour和datediff来获取create_time与当前时间的小时差:
(hour(from_unixtime(unix_timestamp(),'yyyy-MM-dd HH:mm:ss'))-
hour(create_time)+(datediff(from_unixtime(unix_timestamp(),
'yyyy-MM-dd HH:mm:ss'), create_time))*24) as hour_dValue
二、Hive常用查询函数
1、 NVL( string1, replace_with)。
2、它的功能是如果string1为 NULL,则 NVL函数返回 replace_with的值,否则返回 string1的值,如果两个参数都为 NULL,则返回NULL。
3、 date_sub:时间跟天数相减,类似与add,使用一个就ok
4、 select date_sub('2019-06-29',5);
5、 select datediff('2019-06-29','2019-06-24');
6、 CONCAT(string A/col, string B/col…):返回输入字符串连接后的结果,支持任意个输入字符串;
7、 CONCAT_WS(separator, str1, str2,...):它是一个特殊形式的 CONCAT()。之一个参数剩余参数间的分隔符。
8、分隔符可以是与剩余参数一样的字符串。如果分隔符是 NULL,返回值也将为 NULL。
9、这个函数会跳过分隔符参数后的任何 NULL和空字符串。分隔符将被加到被连接的字符串之间;
10、 select concat_ws('-',str1,str2) from XX;//str为string类型的列名
11、 COLLECT_SET(col):函数只接受基本数据类型,它的主要作用是将某字段的值进行去重汇总,
12、练习:把星座和血型一样的人归类到一起
13、 EXPLODE(col):将hive一列中复杂的 array或者 map结构拆分成多行。
14、用法:LATERAL VIEW udtf(expression) tableAlias AS columnAlias
15、解释:用于和 split, explode等UDTF一起使用,它能够将一列数据拆成多行数据,在此基础上可以对拆分后的数据进行聚合。
16、练习:将电影分类中的数组数据展开
17、 select explode(category) from movie_info;
18、 OVER():指定分析函数工作的数据窗口大小,这个数据窗口大小可能会随着行的变化而变化;
19、 UNBOUNDED PRECEDING表示从前面的起点,UNBOUNDEDFOLLOWING表示到后面的终点;
20、 LEAD(col,n):往后第 n行数据;
21、 NTILE(n):把有序分区中的行分发到指定数据的组中,各个组有编号,编号从 1开始,
22、对于每一行,NTILE返回此行所属的组的编号。注意:n必须为 int类型。
23、一、查询在 2017年 4月份购买过的顾客及总人数
24、 group分组一组一个值,over给每一条数据独立开窗
25、 RANK()排序相同时会重复,总数不会变,可以并列
26、 DENSE_RANK()排序相同时会重复,总数会减少
三、hive返回星期几的 ***
熟悉hive的人都知道,在原生版本中,目前并没有返回星期几的函数。为了解决这个问题,除了利用java自己编写udf外,也可以利用现有hive函数实现,笔者整理了以下内容供大家参考: hive返回星期几的 *** :pmod(datediff(#date#, 2012年任意一个星期日的日期),
熟悉hive的人都知道,在原生版本中,目前并没有返回星期几的函数。为了解决这个问题,除了利用java自己编写udf外,也可以利用现有hive函数实现,笔者整理了以下内容供大家参考:
hive返回星期几的 *** :pmod(datediff('#date#','2012年任意一个星期日的日期'), 7)。2012-01-01刚好是星期日,大家可以记忆为:
*** :pmod(datediff('#date#','2012-01-01'), 7)
说明:1、返回值为“0-6”(“0-6”分别表示“星期日-星期六”);2、需要注意pmod和 datediff函数的使用 *** .
1、datediff是两个日期相减的函数,hive日期函数可以见附录:
语法:datediff(string enddate, string startdate)
说明:返回两个时间参数的相差天数。
语法: pmod(int a, int b),pmod(double a, double b)
这个 *** 也不是唯一的 *** ,只是利用了datediff和pmod函数的特点,组合使用而出。内部牛人分享的 *** 也可以达到相同的目的:
pmod(datediff(#date#,'1920-01-01')- 3, 7)
from_unixtime(bigint unixtime[, string format])
UNIX_TIMESTAMP参数表示返回一个值’YYYY- MM– DD HH:MM:SS’或YYYYMMDDHHMMSS.uuuuuu格式,这取决于是否是在一个字符串或数字语境中使用的功能。该值表示在当前的时区。
如果不带参数的调用,返回一个Unix时间戳(从’1970- 01– 0100:00:00′到现在的UTC秒数)为无符号整数。
指定日期参数调用UNIX_TIMESTAMP(),它返回参数值’1970- 01– 0100:00:00′到指定日期的秒数。
unix_timestamp(string date, string pattern)
指定时间输入格式,返回到1970年秒数:unix_timestamp(’2009-03-20′,‘yyyy-MM-dd’)= 1237532400参考:
返回时间中的年月日: to_date(“1970-01-01 00:00:00″)=“1970-01-01″
给定一个日期date,返回一个天数(0年以来的天数)
返回指定时间的年份,范围在1000到9999,或为”零”日期的0。
返回指定时间的月份,范围为1至12月,或0一个月的一部分,如’0000-00-00′或’2008-00-00′的日期。
day(string date) dayofmonth(date)
返回指定时间的小时,范围为0到23。
返回指定时间的分钟,范围为0到59。
返回指定时间的秒,范围为0到59。
返回指定日期所在一年中的星期号,范围为0到53。
datediff(string enddate, string startdate)
date_add(string startdate, int days)
给定时间,在此基础上加上指定【本文来自鸿网互联()】的时间段。
date_sub(string startdate, int days)
给定时间,在此基础上减去指定的时间段。
关于hive时间函数和hive周函数的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。