2016-10-08 9 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とScalaの2.11を持つために、あなたはconf/spark-defaults.confspark.jars.packages

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

を追加することができますか​​ため--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() 
あなたのパスパターンに一致します
関連する問題