標籤:graphx spark
程式功能:收集頂點指向的鄰置中所在地
/* * 找出每個頂點所指向的鄰置中所在的地區 */import org.apache.spark.SparkContextimport org.apache.spark.SparkContext._import org.apache.spark.SparkConfimport scala.collection.mutable.Mapimport org.apache.spark._import org.apache.spark.graphx._import org.apache.spark.rdd.RDDobject testApp{ def main(args:Array[String]){ val conf = new SparkConf().setAppName("testApp") val sc = new SparkContext(conf) val graph = GraphLoader.edgeListFile(sc, "/home/spark/spark/graphx/data/followers.txt")//載入邊時頂點是邊上出現的點 val users = sc.textFile("/home/spark/spark/graphx/data/users.txt").map { line => val fields = line.split(",") (fields(0).toLong,(fields(1),fields(2)))//解析頂點資料:ID(一定轉成Long型),姓名,地區 } val myGraph=Graph.apply(users,graph.edges)//重構圖,頂點資料以users為準 val vertices=myGraph.mapReduceTriplets[Map[String,Int]](//收集每個定點指向的鄰居所在的地區 triplet=>Iterator((triplet.srcId,Map[String,Int](triplet.dstAttr._2->1))),//Map function單向發送訊息給有向邊的源頂點 (a,b)=>{//Reduce function彙集訊息 var myMap=Map[String,Int]() for((k,v)<-a){ if(b.contains(k)) { var t=a(k)+b(k) myMap+=(k->t) } else myMap+=(k->a(k)) } myMap //返回彙集的結果 } ) vertices.collect.foreach(a=>print(a+"\n"))//列印收集的鄰居所在地 }}
users.txt頂點資料:ID,姓名,地區
1,BarackObama,American2,ladygaga,American3,John,American4,xiaoming,Beijing6,Hanmeimei,Beijing7,Polly,American8,Tom,American
followers.txt邊資料:只有源頂點和目標頂點,中間以空格隔開,多餘的列無用,如:2 1 other 有3列資料,但是graphx只會讀取前兩列
2 14 11 26 37 37 66 73 7
結果:
(4,Map(American -> 1))(6,Map(American -> 2))(2,Map(American -> 1))(1,Map(American -> 1))(3,Map(American -> 1))(7,Map(American -> 1))
工程目錄結構:
./test.sbt./src./src/main./src/main/scala./src/main/scala/testApp.scala
test.sbt內容:
name := "test Project"version := "1.0"scalaVersion := "2.10.4"libraryDependencies += "org.apache.spark" %% "spark-core" % "1.0.1"libraryDependencies += "org.apache.spark" %% "spark-graphx" %"1.0.1"resolvers += "Akka Repository" at "http://repo.akka.io/releases/"
命令列執行如下進行編譯:
sbt package
命令列執行如下向叢集提交(開啟了叢集為前提),這裡我的工程建在spark安裝目錄下apps/testApp下,因此下面開頭是../../
../../bin/spark-submit --class "testApp" --master local[4] target/scala-2.10/test-project_2.10-1.0.jar