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

最终效果

posted @ 2023-01-28 12:08  畔山陆仁贾  阅读(634)  评论(0)    收藏  举报