我处理的数据具有树的结构。每个父级可以有多个子级。父级没有关于子级的信息,但每个子级都知道其父级。此外,每个子项都知道它的完整路径,这是一个串联的父标识符字符串,因此每个记录都知道它在树中的级别。此记录有一个结构:
id | parent_id | path
--- + --------- + ------
11 | 1 | 1-11
12 | 1 | 1-12
121 | 12 | 1-12-121
现在我要读这个表,按id分组,求一列的和 value
类型为bigint。最重要的事实是,只有leafs元素(没有子元素)有指定的值,并且每个父元素必须是其所有子元素值的总和。最初,所有父级的值都等于0。
分组前:
Root
| - Parent 1 (value = 0)
| - - Child 11 (value = 1)
| - - Child 12 (value = 1)
| - - Parent 13 (value = 0)
| - - - Child 131 (value = 2)
| - - - Child 132 (value = 1)
| - Parent 2 (value = 0)
| - - Child 21 (value = 2)
| - - Child 22 (value = 1)
分组结果:
Root
| - Parent 1 (value = 5 (1 + 1 + 3))
| - - Child 11 (value = 1)
| - - Child 12 (value = 1)
| - - Parent 13 (value = 3 (2 + 1))
| - - - Child 131 (value = 2)
| - - - Child 132 (value = 1)
| - Parent 2 (value = 3 (2 + 1))
| - - Child 21 (value = 2)
| - - Child 22 (value = 1)
还有一个非常重要的要求:我不能在内存中收集这些数据和分组,因为数据集非常庞大,所以我必须使用数据集或Dataframe来完成。
1条答案
按热度按时间3pvhb19x1#
如果我理解正确,您只对每个节点的值之和感兴趣。在这种情况下,您只需查看节点每次出现在其中一个路径中时的情况,并为相应的节点添加所有此类值。spark版本是:
由此产生: