Spark GraphX入門
阿新 • • 發佈:2018-11-29
圖計算入門級程式
先看這個圖,3和5之間有關係,3和7之間有關係,5和之間有關係,7和1之間有關係,5和2之間有關係,所以這就像是一個關係網,他們兩兩之間可能都有關係
綠色的線,8和9有關係,10和8有關係,那麼可能是9和10之間也存在關係
一個簡單的例子
import org.apache.log4j.{Level, Logger}
import org.apache.spark.graphx.{Edge, Graph, VertexId, VertexRDD}
import org.apache.spark.rdd.RDD
import org.apache.spark. {SparkConf, SparkContext}
object graphXDemo03 {
def main(args: Array[String]): Unit = {
Logger.getLogger("org.apache.spark").setLevel(Level.WARN)
val conf = new SparkConf().setAppName(s"${this.getClass.getName}").setMaster("local")
val sc = new SparkContext(conf)
//設定點
val user = sc.parallelize(Array((3L,("huahua","student")),
(7L,("nini","postdoc")),(5L,("fafa","prof")),
(2L,("lili","prof")),(1L,("minmi","prof")),(9L,("kiki","prof")),(8L,("bobo","prof")),(10L,("kuku","prof"))) )
//設定邊,也就是誰跟誰之間有關係
val relationships = sc.parallelize(Array(Edge(3L,7L,"collab"),
Edge(5L,3L,"advisor"),Edge(2L,5L,"colleague"),Edge(5L,7L,"teacher"),Edge(1L,7L,"teacher"),Edge(8L,9L,"colleague"),Edge(10L,9L,"advisor")))
//構建圖
val graph = Graph(user,relationships)
// 每個關係網中 每個id和最小的以一個元素之間的關聯, 得到的是兩個ID
val conn: VertexRDD[VertexId] = graph.connectedComponents().vertices
conn.foreach(println)
/*
(1,1)
(3,1)
(7,1)
(9,8)
(8,8)
(10,8)
(5,1)
(2,1)
*/
val joined: RDD[(VertexId, (VertexId, (String, String)))] = conn.join(user) //join後
//第一個 VertexId 代表一個元素A和 第二個VertexId代表一個關係圖中id最小的一個B (String, String) 是A元素的值
//join 後得到 (3,(1,(rxin,student))) ,
joined.foreach(println)
/*join後的結果
*(1,(1,(minmi,prof)))
(3,(1,(huahua,student)))
(7,(1,(nini,postdoc)))
(9,(8,(kiki,prof)))
(8,(8,(bobo,prof)))
(10,(8,(kuku,prof)))
(5,(1,(fafa,prof)))
(2,(1,(lili,prof)))
*/
joined.map{
case(userId,(commId,value))=>{
(commId,List((userId,value)))
}
}.reduceByKey((list1,list2)=>{
list1++list2
}).foreach(println)
//把每個關係網中的與id最小的 有關係的的所有的值的總和成一個List
/*
(1,List((1,(minmi,prof)), (3,(huahua,student)), (7,(nini,postdoc)), (5,(fafa,prof)), (2,(lili,prof))))
(8,List((9,(kiki,prof)), (8,(bobo,prof)), (10,(kuku,prof))))
*/
}
}