[英]How to get the Date of the first day of a week given a time stamp in Hadoop Hive?
除了编写自定义UDF以支持此问题以外,是否有已知方法可以实现此目的? 我目前正在使用Hive 0.13。
date_sub(m.invitationdate,pmod(datediff(m.invitationdate,'1900-01-07'),7))
此表达式为我的问题提供了确切的解决方案。
问候,
鲍里斯
这是获取星期几的第一天的最简单,最好的解决方案:
对于当前的timstamp:
select date_sub(from_unixtime(unix_timestamp()), cast(from_unixtime(unix_timestamp(), 'u') AS int)) ;
对于任何给定的日期或列:
select date_sub(from_unixtime(unix_timestamp('2017-05-15','yyyy-MM-dd')), cast(from_unixtime(unix_timestamp('2017-05-15','yyyy-MM-dd'), 'u') AS int)) ;
select date_sub(from_unixtime(unix_timestamp(colname,'yyyy-MM-dd')), cast(from_unixtime(unix_timestamp(colname,'yyyy-MM-dd'), 'u') AS int)) ;
是的,您无需编写UDF就可以做到这一点。 如果在datetime函数下查看Hive文档 ,则有一个from_unixtime()
函数,该函数from_unixtime()
unix时间戳和字符串模式。 文档页面上的几个功能,有一个链接 ,说明可以在此功能中使用的不同模式。 因此,从您的时间戳记中,您可以提取星期几并进行相应的处理。
示例数据 :
1445313193
1445313100
1445313146
1445040000
1445040023
1445040111
前三个是2015-10-19星期一,后三个是2015-10-16星期五。
查询 :
select day_of_week
, date_var
, case when day_of_week = 'Sun' then date_var
when day_of_week = 'Sat' then date_sub(date_var, 6)
when day_of_week = 'Fri' then date_sub(date_var, 5)
when day_of_week = 'Thu' then date_sub(date_var, 4)
when day_of_week = 'Wed' then date_sub(date_var, 3)
when day_of_week = 'Tue' then date_sub(date_var, 2)
when day_of_week = 'Mon' then date_sub(date_var, 1)
else NULL
end as first_day_of_week_date
from (
select from_unixtime(timestamp, 'EEE') day_of_week
, from_unixtime(timestamp, 'yyyy-MM-dd') date_var
from db.table ) A
输出 :
Mon 2015-10-19 2015-10-18
Mon 2015-10-19 2015-10-18
Mon 2015-10-19 2015-10-18
Fri 2015-10-16 2015-10-11
Fri 2015-10-16 2015-10-11
Fri 2015-10-16 2015-10-11
因此,今天返回昨天(星期天),最后一个星期五返回前一个星期日,即第11个。 我假设在“一周的第一天”时,您指的是星期日; 如果没有,您可以将代码调整为星期一。 希望这可以帮助。
从Hive 1.2开始,您还可以像这样:
select next_day(date_sub('2019-01-01', 7), 'MON')
输出:
2018-12-31
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.