我有一张桌子,我只是重复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
答案 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)