Поскольку hive не поддерживает рекурсивный запрос CTE.
Пожалуйста, обратитесь к [https://blog.pythian.com/recursion-in-hive/][1] для одного варианта.
Другой вариант будет использовать сценарий оболочки для цикла и запросанайти младшего ребенка для всех родителей.
Шаги - 1> Инициализация (однократный запуск)
create temporary table hier_temp as select * from Hier;
create table if not exists res as select * from hier where false;
2) запрос для поиска нижестоящего ребенка
insert into table res
select
H1.parent, H1.Child
from hier_temp H1 left outer join hier_temp H2
on H1.Child=H2.Parent where H2.Child is null;
3) Перезаписать временную таблицу следующим уровнем потомка
insert overwrite table hier_temp
select
H1.Parent Parent, coalesce(H3.child, H2.child) as child
from hier_temp H1 left outer join hier_temp H2 on H1.Child=H2.Parent
left outer join res H3 on H2.child=H3.parent
where H2.Child is not null;
Создать сценарий оболочки, который будет последовательно выполнять шаги 2 и 3 в цикле (условный оператор с break и continue выполнит эту работу), пока мы не наденемВ таблице hier_temp отсутствуют данные.
Ниже приведены результаты из таблицы res и hier_temp для данных тестовых данных.
hive> select * from res;
OK
Time taken: 0.131 seconds
hive> select * from hier_temp;
OK
C1 C11
C11 C12
C12 123
P1 C1
P2 C2
Time taken: 0.108 seconds, Fetched: 5 row(s)
Результаты после цикла 1 для запросов, упомянутых в шагах 2 и 3
hive> select * from res;
OK
C12 123
P2 C2
Time taken: 0.137 seconds, Fetched: 2 row(s)
hive> select * from hier_temp;
OK
P1 C11
C1 123
C11 123
Time taken: 0.155 seconds, Fetched: 3 row(s)
Результаты после цикла 2 для запросов, упомянутых в шаге 2 и 3
hive> select * from res;
OK
C12 123
P2 C2
C1 123
C11 123
Time taken: 0.11 seconds, Fetched: 4 row(s)
hive> select * from hier_temp;
OK
P1 123
Time taken: 0.111 seconds, Fetched: 1 row(s)
Результаты цикла 3 для запросов, упомянутых в шаге 2 и 3
hive> select * from res;
OK
P1 123
C12 123
P2 C2
C1 123
C11 123
Time taken: 0.115 seconds, Fetched: 5 row(s)
hive> select * from hier_temp;
OK
Time taken: 0.16 seconds
Получитсяжелаемые результаты, но вам, возможно, придетсявремя, затраченное на выполнение.
Надеюсь, это поможет