У меня есть требование скопировать диапазоны дат из 2 исходных таблиц кустов в целевую таблицу кустов.
Входная таблица1 с образцами данных, показанными ниже:
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
Входная таблица2 с образцами данных, показанными ниже:
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 должен быть заполнен с использованием p_id table1 или p_id_num таблицы 2.
fin_period - a) Минимальное значение должно быть взято из столбца min (year_month) таблицы 2 и преобразовано в формат ГГГГ-ММ-ДД.2019-01-01 в этом примере данных.
b) Максимальное значение должно быть взято из столбца max (fin_period) таблицы table1 и преобразовано в формат YYYY-MM-DD.2019-04-01 в этом примере данных.
c) Также должны быть заполнены все строки между min и max.Таким образом, у нас будут значения 2019-01-01, 2019-02-01, 2019-03-01 и 2019-04-01 для этого столбца в целевой таблице.
sn_period - a) Минимальное значение должно быть взято из соответствующего столбца sn_period для определенного fin_period из таблицы1 и преобразовано в формат YYYY-MM-DD.Например, для fin_period APR-19 / 2019-04-01 минимальный sn_period составляет SEP-18 / 2018-09-01.
b) Максимальное значение должно быть взято из max sn_period для определенного p_idнезависимо от fin_period и конвертируется в формат ГГГГ-ММ-ДД.Например, максимальный sn_period в таблице 1 для p_id 12345 равен DEC-18, поэтому максимальное значение sn_period для fin_period 2019-04-01 будет 2018-12-01.
c) Все строки между min иmax sn_period также должен быть заполнен.Таким образом, у нас будет несколько строк с различным sn_period для каждого fin_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
Точно так же нам понадобятся строки для других идентификаторов / p_id / p_id_num в целевой таблице.
Я пытался добиться этого с помощью запросов улья, но не былуспешный.Я мог бы подумать о множественном выборе из исходных таблиц с помощью UNION, но получение максимальных и минимальных дат оказывается трудным делом.
Я также подумал об использовании Spark RDD в Scala и заполнении значений в target, перебираястрок, но это тоже не сработало.
Ниже приводится то, что я пытаюсь, и которое дает мне частичные результаты:
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'
Любые предложения, если подход правильный или любые альтернативные подходы, которые ястоит попробовать?