簡體   English   中英

如何在Hadoop Hive中給定時間戳記以獲取一周中第一天的日期?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM