2016-10-08 2 views
6

Я создал ориентированный граф, используя graphx.Как получить соседей из двух хопов в spark-graphx?

#src->dest 
a -> b 34 
a -> c 23 
b -> e 10 
c -> d 12 
d -> c 12 
c -> d 11 

Я хочу, чтобы все два хмель соседей, как это:

a -> e 44 
a -> d 34 

Мой график очень большой, поэтому я хотел бы сделать это элегантно и эффективно. Есть ли у кого-нибудь советы о том, каким будет лучший способ сделать это над экземпляром графа?

ответ

2

Вы можете кратко выразить это с помощью библиотеки GraphFrames. Сначала вы должны включить требуемый пакет. Для с Спарк 2.0 и Scala 2.11 вы можете добавить

graphframes:graphframes:0.2.0-spark2.0-s_2.11 

к spark.jars.packages в conf/spark-defaults.conf или передать его в качестве аргумента для --packagesspark-submit.

Далее следует преобразовать Graph в GraphFrame. Вы можете использовать fromGraphX метод:

import org.graphframes.GraphFrame 
import org.apache.spark.graphx._ 

val nodes = sc.parallelize(Seq(
    (1L, "a"), (2L, "b"), (3L, "c"), (4L, "d"), (5L, "e"))) 

val edges = sc.parallelize(Seq(
    Edge(1L, 2L, 34), Edge(1L, 3L, 23), Edge(2L, 5L, 10), 
    Edge(3L, 4L, 12), Edge(3L, 3L, 12), Edge(3L, 5L, 11))) 

val graph = Graph(nodes, edges) 

val graphFrame = GraphFrame.fromGraphX(graph) 

GraphFrame обеспечивает найти метод, который принимает шаблон на языке, подобной Cypher. Две хмеля может быть выражен как:

val pattern = "(x1) - [a] -> (x2); (x2) - [b] -> (x3)" 

, где (_) представляет узлы и [_] края. Вы пути согласования шаблона:

val paths = graphFrame.find(pattern) 

и select полей:

paths.select($"x1.attr", $"x3.attr", $"a.attr" + $"b.attr").show()