Копирование диапазонов дат из разных столбцов разных исходных таблиц в столбцы целевой таблицы в Hive - PullRequest
0 голосов
/ 14 июня 2019

У меня есть требование скопировать диапазоны дат из 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

Требуется заполнить целевую таблицу следующими бизнес-правилами:

  1. Столбец ID должен быть заполнен с использованием p_id table1 или p_id_num таблицы 2.

  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'

Любые предложения, если подход правильный или любые альтернативные подходы, которые ястоит попробовать?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...