1. 程式人生 > >Spark GraphX入門

Spark GraphX入門

圖計算入門級程式
先看這個圖,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)))) */ } }