を使用すると、Apacheはスパーク使用しているとして、あなたはあなたのために仕事をするためにGraphXコンポーネントで構築を使用することができます。
import org.apache.spark.graphx._
def cross[Y](xs: Traversable[Y], ys: Traversable[Y]) = for { x <- xs; y <- ys } yield (x, y)
val data = sc.parallelize(List(
"1\t5\t3",
"3\t9\t30",
"7\t10\t12",
"10\t7\t13"
))
val prep = data.map(x => x.split("\t").map(_.toLong).toList)
val vertex = prep
.flatMap(x => x)
.map(x => x -> s"ID=$x")
val edges = prep
.map(x => cross(x, x))
.flatMap(x => x)
.map(x => new Edge(x._1, x._2, "likes"))
val graph = Graph(vertex, edges)
val linked = graph
.connectedComponents
.vertices
.map(_.swap)
.groupByKey
linked.take(10).foreach(println)
は、次の結果を出力します:
(1,CompactBuffer(30, 3, 9, 1, 5))
(7,CompactBuffer(7, 10, 12, 13))
クロスは、単にので、我々はすべての頂点間のエッジを作成することができる二つのリストのクロス積を作成します。
connectedComponents関数は、グラフをたどり、エッジを共有するすべての頂点を見つけ、各頂点が頂点Id-> "Primary" VertexIDのタプルである新しいグラフを作成します。
ので:あなたは1と7は、「次頂点」として選ばれ、最初のグラフに接続されたすべての頂点にリンクされている見ることができるように
graph.connectedComponents.vertices.take(10).foreach(println)
は
(30,1)
(1,1)
(3,1)
(5,1)
(7,7)
(9,1)
(10,7)
(12,7)
(13,7)
をプリントアウトだろう。したがって、単純なスワップとグループはすべての接続IDを結合します。
。com/questions/40240409/apache-spark-rdd-substitution/40256149#40256149 – maasg