【问题标题】:Hive/Impala - Find End Child nodes in Hierarchy Structure tableHive/Impala - 在层次结构表中查找结束子节点
【发布时间】:2019-06-26 05:07:38
【问题描述】:

我有一个场景,从具有 parent_node_id 和 child_node_id 的层次结构表中找到最低级别的子节点,如下所示。 源表在 Hive 和 Impala 数据库中。 请建议 hive/impala 查询以找出源表中每个父节点的最低级别子节点。

我尝试在 Impala 中使用 CTE 递归查询,但我猜它不受支持。

提前感谢您!

源表:

+-------------+--------------+
|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     |
+-------------+--------------+

【问题讨论】:

  • @gobrewers14 - 请帮助解决这个问题。

标签: hadoop hive hiveql impala


【解决方案1】:

由于 hive 不支持递归 CTE 查询。

请参考 [https://blog.pythian.com/recursion-in-hive/][1] 了解其中一个选项。

其他选项是使用 shell 脚本循环和查询以找到所有父母的最低孩子。

步骤 - 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;

创建一个 shell 脚本,它将在循环中依次执行步骤 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)

第 2 步和第 3 步中提到的查询在 loop1 之后的结果

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 步和第 3 步中提到的查询在 loop2 之后的结果

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)

第 2 步和第 3 步中提到的查询的结果循环 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

这将为您带来想要的结果,但您可能需要考虑执行所花费的时间。

希望对你有帮助

【讨论】:

  • 您的回复!我会试试这个解决方案。
  • 在输出中我们得到 C1 --> C12 但 C12 的子节点是 123。我期待输出中的 C1--> 123。请帮助更正查询。
  • 请帮助修改此查询以获得所需的结果。
  • 你现在可以检查一下吗,我又添加了一个连接,最好用更多示例检查以确保查询没有问题
  • 这适用于样本数据。我将尝试在实际数据集上运行这种方法。非常感谢!!
猜你喜欢
  • 1970-01-01
  • 2015-03-24
  • 1970-01-01
  • 2021-09-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多