Запуск лямбда-выражения для каждого подключенного компонента в Spark GraphX

Я пытаюсь выполнить некоторую лямбду для каждого связного компонента в графике Spark. Я получаю подключенные компоненты с помощью метода connectedComponents (), но тогда я не мог найти другого способа, кроме сбора всех отдельных идентификаторов вершин графа с метками, назначенными компонентам, а затем выполнения foreach и получения каждого компонента с помощью метода subgraph (). Но это последовательный процесс, и если в моем графике много мелких компонентов, его нельзя масштабировать. Кто-нибудь может мне помочь? Есть ли способ сказать что-то вроде connectedComponentsGraph.foreachComponent (lambda)?


person Viacheslav Inozemtsev    schedule 10.01.2018    source источник


Ответы (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
comment
Большое спасибо! Вы дали мне подсказку, и я сделал то же самое, даже не переключившись на GraphFrame. Кстати, почему вы его рекомендуете (кроме того, что оно новее)? - person Viacheslav Inozemtsev; 11.01.2018
comment
Другой вопрос, может быть, вы могли бы помочь, знаете ли вы, как указать количество итераций для метода connectedComponents ()? У меня есть несколько синтетических тестов, и все они требуют разного количества итераций. Какая здесь может быть стратегия? - person Viacheslav Inozemtsev; 11.01.2018