Связывание значений двух столбцов в Spark DataFrame (или DataSet) - PullRequest
0 голосов
/ 08 июня 2019

У меня есть таблица с двумя столбцами, как показано ниже:

|а |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, 4), что является результатом (1,3), (3,4) в кадре данных.

Я могу сделать это, используя count () и повторяя самостоятельное соединение, пока список больше не будет расти.Однако я ищу более разумный способ сделать это без использования count (), которое является действием и в основном собирает данные.

1 Ответ

1 голос
/ 10 июня 2019

Это больше относится к обработке графа, чем к фрейму данных. 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] находятся в одном компоненте. Также [7,8,9] имеют свой собственный компонент

...