我有一个包含两列的表格,如下所示:
|一个| b |
| 1 | 2 |
| 2 | 3 |
| 3 | 4 |
| 7 | 8 |
| 8 | 9 |
我想将row1.b == row2.a的行链接起来,并将row1.a,row2.b添加到数据框。像(1,2),(2,3)->将(1,3)添加到列表中。这必须继续进行,直到我将(1,3),(3,4)的结果添加到(1,4)列到数据帧中为止。
我可以使用count()并重复一次自我联接,直到列表不再增长为止。但是,我正在寻找一种更聪明的方法,而无需使用count()这是一个动作,并且基本上可以收集数据。
答案 0 :(得分:1)
与图形处理相比,这要与数据帧做更多的事情。 Spark具有可以处理图形处理的graphX库。您或多或少希望从图结构中找到连接的组件。
如果具有edgeDF,则边缘数据帧为:
+---+---+
|src|dst|
+---+---+
|1 |2 |
|2 |3 |
|3 |4 |
|7 |8 |
|8 |9 |
+---+---+
和vertexDF为:
+---+
|id |
+---+
|1 |
|2 |
|3 |
|4 |
|7 |
|8 |
|9 |
+---+
您的图形为:
val g = GraphFrame(vertexDF, edgeDF)
比您可以在其上运行连接的组件
val cc = g.connectedComponents.run()
它会给你这样的东西:
+---+------------+
|id |component |
+---+------------+
|1 |171798691840|
|2 |171798691840|
|3 |171798691840|
|4 |171798691840|
|7 |807453851648|
|8 |807453851648|
|9 |807453851648|
+---+------------+
表示 [1、2、3、4] 位于同一组件中。另外,[em> [7,8,9] 有自己的组成部分