Я пытаюсь выполнить некоторую лямбду для каждого связного компонента в графике Spark. Я получаю подключенные компоненты с помощью метода connectedComponents (), но тогда я не мог найти другого способа, кроме сбора всех отдельных идентификаторов вершин графа с метками, назначенными компонентам, а затем выполнения foreach и получения каждого компонента с помощью метода subgraph (). Но это последовательный процесс, и если в моем графике много мелких компонентов, его нельзя масштабировать. Кто-нибудь может мне помочь? Есть ли способ сказать что-то вроде connectedComponentsGraph.foreachComponent (lambda)?
Запуск лямбда-выражения для каждого подключенного компонента в Spark GraphX
Ответы (1)
Я бы рекомендовал использовать graphframes
:
import org.graphframes._
val graph: Graph = ???
val gdf = GraphFrame.fromGraphX(graph)
val components = gdf.connectedComponents.setAlgorithm("graphx").run()
и продолжайте с базовым SQL:
components
.join(gdf.vertices, Seq("id"))
.join(gdf.edges.select($"src" as "id"), Seq("id"))
.groupBy("component")
.count
person
Alper t. Turker
schedule
10.01.2018
Большое спасибо! Вы дали мне подсказку, и я сделал то же самое, даже не переключившись на GraphFrame. Кстати, почему вы его рекомендуете (кроме того, что оно новее)?
- person Viacheslav Inozemtsev; 11.01.2018
Другой вопрос, может быть, вы могли бы помочь, знаете ли вы, как указать количество итераций для метода connectedComponents ()? У меня есть несколько синтетических тестов, и все они требуют разного количества итераций. Какая здесь может быть стратегия?
- person Viacheslav Inozemtsev; 11.01.2018