如何在hive中使用weekofyear生成唯一的weekid

时间:2018-03-12 12:34:02

标签: hive hiveql

我有一张桌子,我只是重复50年的日期。

使用weekofyear(“date”)的值 - > week_no_in_this_year。

我想使用(week_no_in_this_year)创建一个列,它应该是一周的唯一。将其命名为 - > week_id

应该是Year + two_digit_week_no_in_this_year + Some_number的连接(使这个id在一周内唯一)。我尝试过如下:

  

的concat(CONCAT(YEAR,IF(week_no_in_this_year< 10,   concat(0,week_no_in_this_year),week_no_in_this_year)),'2')AS week_id。

但我面临以下情景的几个日期问题:

SELECT weekofyear("2019-01-01") ;
SELECT concat(concat("2019",IF(1<10, concat(0,1),1)),'2') AS week_id;
Expected Result: 2019012

SELECT weekofyear("2019-12-31");
SELECT concat(concat("2019",IF(1<10, concat(0,1),1)),'2') AS week_id;
Expected Result: 2020012

2 个答案:

答案 0 :(得分:0)

这种情况只发生在给定年份(即12月31日)结束时的年份与周数转换到明年之间。如果我们为这种情况设定条件,那么我们就会得到你期望的结果。

  

右侧函数与substr(, - n)相同。

SELECT DTE as Date, 
 CONCAT(IF(MONTH(DTE)=12 and WEEKOFYEAR(DTE)=1, year(DTE)+1, year(DTE)), 
           SUBSTR(CONCAT('0', WEEKOFYEAR(DTE)), -2), '2') as weekid 
FROM tbl;

Result:
Date            WeekId
2019-01-01      2019012
2019-11-01      2019442
2019-12-31      2020012

答案 1 :(得分:0)

一种方法是使用UDF。创建一个python脚本并将其推送到HDFS

mypy.py

import sys
import datetime

for line in sys.stdin:
  line = line.strip()
  (y,m,d) = line.split("-")
  d = datetime.date(int(y),int(m),int(d)).isocalendar()
  print str(d[0])+str(d[1])

在Hive中

add file hdfs:/user/cloudera/mypy.py;

select transform("2019-1-1") using "python mypy.py" as (week_id);
INFO  : OK
+----------+--+
| week_id  |
+----------+--+
| 20191    |
+----------+--+

select transform("2019-12-30") using "python mypy.py" as (week_id)
+----------+--+
| week_id  |
+----------+--+
| 20201    |
+----------+--+
1 row selected (33.413 seconds)