将日期范围从不同源表的不同列复制到Hive中的目标表的列

时间:2019-06-14 10:49:18

标签: apache-spark hive

我需要将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

要求是使用以下业务规则填充目标表:

  1. ID列应使用表1的p_id或表2的p_id_num填充。

  2. 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。

  1. sn_period- a)对于表1中的特定fin_period,应从相应的sn_period列中获取最小值,并将其转换为YYYY-MM-DD格式。例如对于fin_period APR-19 / 2019-04-01,最小sn_period为SEP-18 / 2018-09-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'

如果方法正确或我应该尝试的其他替代方法,有何建议?

0 个答案:

没有答案
相关问题