如何在hadoophive中获得给定时间戳的一周的第一天的日期?

w6lpcovy  于 2021-05-29  发布在  Hadoop
关注(0)|答案(4)|浏览(475)

除了编写一个自定义的udf来支持这个问题之外,还有什么已知的方法来实现这个问题吗?我现在用的是Hive0.13。

svmlkihl

svmlkihl1#

date_sub(m.invitationdate,pmod(datediff(m.invitationdate,'1900-01-07'),7)) 这个表达式精确地解答了我的问题。
当做,
鲍里斯

u5i3ibmn

u5i3ibmn2#

从hive 1.2开始,您也可以这样做:

select next_day(date_sub('2019-01-01', 7), 'MON')

输出:

2018-12-31
goqiplq2

goqiplq23#

这是获取一周日期的第一天的最简单和最好的解决方案:
对于当前时间戳:

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)) ;
qv7cva1a

qv7cva1a4#

是的,你不用写自定义项就可以做到这一点。如果您查看datetime函数下的配置单元文档,就会发现一个函数 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号。我假设“一周的第一天”是指星期天;如果不是,你可以把代码改成星期一。希望这有帮助。

相关问题