2016-10-08 1 views
6

graphx를 사용하여 유향 그래프를 만들었습니다.spark-graphx에서 2 홉 이웃을 얻는 방법은 무엇입니까?

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

나는 이런 식으로 총 2 개 홉 이웃을 얻으려면 :

a -> e 44 
a -> d 34 

내 그래프는 매우 큰, 그래서 나는 우아하고 효율적으로 작업을 수행하고 싶습니다. 누구든지 그래프 인스턴스를 통해이를 수행하는 가장 좋은 방법은 무엇인지에 대한 조언이 있습니까?

답변

2

GraphFrames 라이브러리를 사용하여 간결하게 표현할 수 있습니다. 먼저 필요한 패키지를 포함시켜야합니다. 스파크 2.0 및 스칼라 2.11에 들어 당신은 conf/spark-defaults.confspark.jars.packages

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

을 추가하거나 spark-submit에 대한 --packages 인수로 전달합니다.

다음으로 GraphGraphFrame으로 변환해야합니다.

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은 사이퍼와 유사한 언어의 패턴을 취 방법을 찾을 제공 : 당신은 fromGraphX 방법을 사용할 수 있습니다.

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() 
당신 경로 패턴을 일치