Spark DataFrame(或DataSet)中两列的链接值

时间:2019-06-07 23:18:37

标签: apache-spark apache-spark-sql apache-spark-dataset

我有一个包含两列的表格,如下所示:

|一个| 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()这是一个动作,并且基本上可以收集数据。

1 个答案:

答案 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] 有自己的组成部分