Hive-根据日期时间段生成动态序列
问题描述
业务部门有一个数据需求,根据会员用户的权益的起始日期和结束日期,动态生成此日期范围内的日期序列;
原始数据
user_name | begin_date | end_date |
---|---|---|
zhangsan | 2020-05-01 | 2020-05-10 |
zhangsan | 2020-05-12 | 2020-05-15 |
lisi | 2020-05-05 | 2020-05-15 |
期望数据
user_name | current_date | begin_date | end_date |
---|---|---|---|
lisi | 2020-05-05 | 2020-05-05 | 2020-05-15 |
lisi | 2020-05-06 | 2020-05-05 | 2020-05-15 |
lisi | 2020-05-07 | 2020-05-05 | 2020-05-15 |
lisi | 2020-05-08 | 2020-05-05 | 2020-05-15 |
lisi | 2020-05-09 | 2020-05-05 | 2020-05-15 |
lisi | 2020-05-10 | 2020-05-05 | 2020-05-15 |
lisi | 2020-05-11 | 2020-05-05 | 2020-05-15 |
lisi | 2020-05-12 | 2020-05-05 | 2020-05-15 |
lisi | 2020-05-13 | 2020-05-05 | 2020-05-15 |
lisi | 2020-05-14 | 2020-05-05 | 2020-05-15 |
lisi | 2020-05-15 | 2020-05-05 | 2020-05-15 |
zhangsan | 2020-05-12 | 2020-05-12 | 2020-05-15 |
zhangsan | 2020-05-13 | 2020-05-12 | 2020-05-15 |
zhangsan | 2020-05-14 | 2020-05-12 | 2020-05-15 |
zhangsan | 2020-05-15 | 2020-05-12 | 2020-05-15 |
zhangsan | 2020-05-01 | 2020-05-01 | 2020-05-10 |
zhangsan | 2020-05-02 | 2020-05-01 | 2020-05-10 |
zhangsan | 2020-05-03 | 2020-05-01 | 2020-05-10 |
zhangsan | 2020-05-04 | 2020-05-01 | 2020-05-10 |
zhangsan | 2020-05-05 | 2020-05-01 | 2020-05-10 |
zhangsan | 2020-05-06 | 2020-05-01 | 2020-05-10 |
zhangsan | 2020-05-07 | 2020-05-01 | 2020-05-10 |
zhangsan | 2020-05-08 | 2020-05-01 | 2020-05-10 |
zhangsan | 2020-05-09 | 2020-05-01 | 2020-05-10 |
zhangsan | 2020-05-10 | 2020-05-01 | 2020-05-10 |
解决思路
分析原始数据,发现每个用户会有不同的权益生效日期;
这就需要我们
1.计算生效日期覆盖的天数
通过datediff函数,根据开始和结束日期,计算需要重复的行数n,使用日期计算函数(结束日期end_date - 开始日期begin_date);
2.动态生成一个字符串
使用repeat函数,用一个固定字符串模板来填充内容,生成一段字符串;
3.切割字符串生成数组对象
使用split函数,按照上面我们定义的字符串模板来动态生成一个长度为n的数组对象;
4.数据列转行
通过posexplode()函数,该函数接收一个数组对象作为入参,函数返回值为入参(数组对象)的值,对其进行了列转行,除此之外,同时生成一个行号列;
解决方案
select
user_name,
date_add(begin_date, t2.x) as current_date,
begin_date,
end_date
from
tb_test t1
lateral view
posexplode(split(repeat('a,',datediff(end_date, begin_date) + 1),',')) t2 as x,y