我需要将2个源配置单元表中的日期范围复制到目标配置单元表中。
输入table1并显示以下示例数据:
Table1
p_id fin_period sn_period
12345 MAR-19 OCT-18
12345 MAR-19 NOV-18
12345 MAR-19 DEC-18
12345 FEB-19 OCT-18
12345 FEB-19 NOV-18
12345 APR-19 SEP-18
12345 APR-19 OCT-18
12345 APR-19 NOV-18
12345 JAN-19 OCT-18
12345 JAN-19 NOV-18
12345 JAN-19 DEC-18
输入table2并显示以下示例数据:
Table2
p_id_num year_month
12345 2019-01
12345 2019-02
12345 2019-03
目标表结构如下:
Target_table
ID String
fin_period Date
sn_period Date
要求是使用以下业务规则填充目标表:
ID列应使用表1的p_id或表2的p_id_num填充。
fin_period- a)最小值应从表2的min(year_month)列中获取并转换为YYYY-MM-DD格式。此示例数据中为2019年1月1日。
b)最大值应从表1的max(fin_period)列中获取并转换为YYYY-MM-DD格式。此示例数据中为2019-04-01。
c)最小和最大之间的所有行也应填充。因此,目标表中此列的值将为2019-01-01、2019-02-01、2019-03-01和2019-04-01。
b)对于特定的p_id,应从max sn_period中获取最大值,而与fin_period无关,并将其转换为YYYY-MM-DD格式。例如,表1中p_id 12345的最大sn_period为DEC-18,因此fin_period 2019-04-01的sn_period的最大值为2018-12-01。
c)最小和最大sn_period之间的所有行也应填充。因此,对于每个fin_period,我们将有多行具有不同的sn_period。例如,对于fin_period 2019-04-01,我们将sn_period设置为2018-09-01、2018-10-01、2018-11-01和2018-12-01。
下面是Target_table与数据的外观:
Target_table
ID Fin_period sn_period
12345 2019-01-01 2018-10-01
12345 2019-01-01 2018-11-01
12345 2019-01-01 2018-12-01
12345 2019-02-01 2018-10-01
12345 2019-02-01 2018-11-01
12345 2019-02-01 2018-12-01
12345 2019-03-01 2018-10-01
12345 2019-03-01 2018-11-01
12345 2019-03-01 2018-12-01
12345 2019-04-01 2018-09-01
12345 2019-04-01 2018-10-01
12345 2019-04-01 2018-11-01
12345 2019-04-01 2018-12-01
同样,我们在目标表中也需要其他ID / p_id / p_id_num的行。
我尝试使用配置单元查询来实现它,但是没有成功。我可以考虑使用UNION从源表中进行多项选择,但事实证明很难获得最大和最小日期。
我还考虑过在Scala中使用Spark RDD,并通过遍历行来填充目标中的值,但这也不起作用。
下面是我正在尝试的操作,它给了我部分结果:
Select p_number, from_unixtime(unix_timestamp(sn_period, 'MMM-YY'), 'YYYY-MM-DD') sn_period, min(from_unixtime(unix_timestamp(year_month, 'YYYY-MM'), 'YYYY-MM-DD')) fin_period
from table1 join table2
on p_id = p_id_num
where p_id = '12345'
group by p_id, sn_period
UNION
Select p_id, from_unixtime(unix_timestamp(sn_period, 'MMM-YY'), 'YYYY-MM-DD') sn_period, from_unixtime(unix_timestamp(fin_period, 'MMM-YY'), 'YYYY-MM-DD') fin_period
from table1 join table2
on p_id = p_id_num
where p_id = '12345'
如果方法正确或我应该尝试的其他替代方法,有何建议?