Hive 如何通过蜂巢获得一周和一年的开始日期? 目标:

Hive 如何通过蜂巢获得一周和一年的开始日期? 目标:,hive,Hive,我有如下表格。我想在2019年开始每周的第一天。一周的开始日必须是星期一 week 23 24 25 26 ... 预期: 尝试: 我读了date\u sub和date\u add,但没有得到我想要的 注: 我的问题与此类似。区别在于最后一个问题是由python解决的 答案更新: 我无法使用可用的配置单元功能执行此操作。必须用Python编写一个UDF datefunction.py: import sys from datetime import datetime, timedelta

我有如下表格。我想在2019年开始每周的第一天。一周的开始日必须是星期一

week 
23
24
25
26 
...
预期: 尝试: 我读了
date\u sub
date\u add
,但没有得到我想要的

注:
我的问题与此类似。区别在于最后一个问题是由python解决的

答案更新: 我无法使用可用的配置单元功能执行此操作。必须用Python编写一个UDF

datefunction.py:

import sys
from datetime import datetime, timedelta
try:
    for line in sys.stdin:
        week=line.strip()
        year="2019"
        newDate = datetime.strptime(year+week + ' 1', "%Y%W %w")
        my_date = newDate- timedelta(days=7)
        format_date = my_date.strftime('%Y-%m-%d')

        sys.stdout.write('\t'.join([week,str(format_date)]) + '\n')

except:
    print(sys.exc_info())
将此udf添加到配置单元:

add file /your udf location path/python/datefunction.py;
在配置单元中创建了列week数据类型为int的test_week表,并输入了几周数据

Results as below:

hive> select TRANSFORM (week) USING 'python datefunction.py' As (week,startofday) from db.test_week;
Total jobs = 1
Launching Job 1 out of 1
Status: Running (Executing on YARN cluster with App id application_1563337199692_13076)

--------------------------------------------------------------------------------
        VERTICES      STATUS  TOTAL  COMPLETED  RUNNING  PENDING  FAILED  KILLED
--------------------------------------------------------------------------------
Map 1 ..........   SUCCEEDED      1          1        0        0       0       0
--------------------------------------------------------------------------------
VERTICES: 01/01  [==========================>>] 100%  ELAPSED TIME: 0.83 s
--------------------------------------------------------------------------------
OK
23      2019-06-03
24      2019-06-10
25      2019-06-17
26      2019-06-24
27      2019-07-01
28      2019-07-08
29      2019-07-15
30      2019-07-22
31      2019-07-29
32      2019-08-05

我找到了下一个有用的例子,关于源代码,并根据您的目的进行了改编:

select 23 as weeknumber,
date_format(date_sub(from_unixtime(unix_timestamp('2018-12-29','yyyy-MM-dd')+(23*7*24*60*60)),pmod(datediff(from_unixtime(unix_timestamp('2018-12-29','yyyy-MM-dd')+(23*7*24*60*60)),'1900-01-07'),7)),"MMMMM dd,yyyy") as startday,
date_format(date_add(from_unixtime(unix_timestamp('2018-12-29','yyyy-MM-dd')+(23*7*24*60*60)),6 - pmod(datediff(from_unixtime(unix_timestamp('2018-12-29','yyyy-MM-dd')+(23*7*24*60*60)),"1900-01-07"),7)),"MMMMM dd,yyyy") as endday;
因此,将常数“23”与您的列一起更改,2018-12-28与您需要的上一年年底一起更改

简单地说,sql代码实现了以下功能:

  • 获取一周:23,将其转换为秒(23*7(一周中有几天)*24小时*60分钟*60秒)
  • 以秒为单位的转换也是前一年最后一周的最后一天(2018年12月28日)
  • 将两个总数相加,结果将是一个日期
  • 有了日期,我们可以计算一周的第一天(最后一天,我知道你不需要它,但也许有人会需要它)
现在,在我的示例中,由于我的UTC,一周的第一天是星期天,而不是您期望的星期一

希望这是你需要的

结果:
选择下一天(“2019-08-22”,“星期一”)

根据一年中给定的一周开始一天我无法验证你的答案,因为我无法使用自定义项。我只想让蜂巢司令部得到答案。@Jack。。没有问题。我在Hive中确实很难做到这一点,最后使用了Python.:-)@这不是我想要的,它是在特定的日期,但不是周数。@Jack,我刚刚编辑了答案。请再次检查。@F.Lazarescu我有数字列,而不仅仅是一个数字。是的,杰克,正如我给你写的那样,把你的列名改为“23”,然后在末尾写上“.从你的表名”。它应该会起作用。你试过了吗?如果从2019年起只有几周,则只需更改常量“23”。选择日期(“2019-08-22”,cast(日期格式(“2019-08-22”,“u”)为int)-1);你能在蜂箱里做这个吗?
select 23 as weeknumber,
date_format(date_sub(from_unixtime(unix_timestamp('2018-12-29','yyyy-MM-dd')+(23*7*24*60*60)),pmod(datediff(from_unixtime(unix_timestamp('2018-12-29','yyyy-MM-dd')+(23*7*24*60*60)),'1900-01-07'),7)),"MMMMM dd,yyyy") as startday,
date_format(date_add(from_unixtime(unix_timestamp('2018-12-29','yyyy-MM-dd')+(23*7*24*60*60)),6 - pmod(datediff(from_unixtime(unix_timestamp('2018-12-29','yyyy-MM-dd')+(23*7*24*60*60)),"1900-01-07"),7)),"MMMMM dd,yyyy") as endday;