Hive / Impala - Найти конечные дочерние узлы в таблице структуры иерархии - PullRequest
0 голосов
/ 01 февраля 2019

У меня есть сценарий поиска дочерних узлов самого низкого уровня из таблицы иерархии, имеющих parent_node_id и child_node_id, как показано ниже.Исходная таблица находится в базе данных Hive и Impala.Пожалуйста, предложите запрос куста / импалы, чтобы определить дочерние узлы самого низкого уровня для каждого родительского узла в исходной таблице.

Я пытался использовать рекурсивный запрос CTE в Impala, но, думаю, он не поддерживается.

Заранее спасибо!

Исходная таблица:

+-------------+--------------+
|child_node_id|parent_node_id|
+-------------+--------------+
|     C1      |      P1      |
+-------------+--------------+
|     C2      |      P2      |   
+-------------+--------------+
|     C11     |      C1      |
+-------------+--------------+
|     C12     |      C11     |
+-------------+--------------+
|     123     |      C12     |
+-------------+--------------+

Ожидаемый результат:

+-------------+--------------+
|parent_node  |lowest_l_child|
+-------------+--------------+
|     P1      |      123     | 
+-------------+--------------+
|      P2     |       C2     |
+-------------+--------------+
|     C1      |      123     |
+-------------+--------------+
|     C11     |      123     |
+-------------+--------------+
|     C12     |      123     |
+-------------+--------------+

1 Ответ

0 голосов
/ 04 февраля 2019

Поскольку 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

Получитсяжелаемые результаты, но вам, возможно, придетсявремя, затраченное на выполнение.

Надеюсь, это поможет

...