Spark GraphX是一個分散式的圖處理框架。社交網路中,用戶與用戶之間會存在錯綜複雜的聯繫,如微信、QQ、微博的用戶之間的好友、關註等關係,構成了一張巨大的圖,單機無法處理,只能使用分散式圖處理框架處理,Spark GraphX就是一種分散式圖處理框架。 1. POM文件 在項目的pom文件中 ...
Spark GraphX是一個分散式的圖處理框架。社交網路中,用戶與用戶之間會存在錯綜複雜的聯繫,如微信、QQ、微博的用戶之間的好友、關註等關係,構成了一張巨大的圖,單機無法處理,只能使用分散式圖處理框架處理,Spark GraphX就是一種分散式圖處理框架。
1. POM文件
在項目的pom文件中加上Spark GraphX的包:
<dependency> <groupId>org.apache.spark</groupId> <artifactId>spark-graphx_2.10</artifactId> <version>1.6.0</version> </dependency>
2. 設置運行環境
// 設置運行環境 val conf = new SparkConf().setAppName("Simple GraphX").setMaster("spark://master:7077").setJars(Seq("E:\\Intellij\\Projects\\SimpleGraphX\\SimpleGraphX.jar")) val sc = new SparkContext(conf)
3. 圖的構造
圖是由若幹頂點和邊構成的,Spark GraphX裡面的圖也是一樣的,所以在初始圖之前,先要定義若幹的頂點和邊:
// 頂點 val vertexArray = Array( (1L,("Alice", 38)), (2L,("Henry", 27)), (3L,("Charlie", 55)), (4L,("Peter", 32)), (5L,("Mike", 35)), (6L,("Kate", 23)) ) // 邊 val edgeArray = Array( Edge(2L, 1L, 5), Edge(2L, 4L, 2), Edge(3L, 2L, 7), Edge(3L, 6L, 3), Edge(4L, 1L, 1), Edge(5L, 2L, 3), Edge(5L, 3L, 8), Edge(5L, 6L, 8) )
然後再利用點和邊生成各自的RDD:
//構造vertexRDD和edgeRDD val vertexRDD:RDD[(Long,(String,Int))] = sc.parallelize(vertexArray) val edgeRDD:RDD[Edge[Int]] = sc.parallelize(edgeArray)
最後利用兩個RDD生成圖:
// 構造圖 val graph:Graph[(String,Int),Int] = Graph(vertexRDD, edgeRDD)
4. 圖的屬性操作
Spark GraphX圖的屬性包括:
(1)graph.vertices:圖中的所有頂點;
(2)graph.edges:圖中所有的邊;
(3)graph.triplets:由三部分組成,源頂點,目的頂點,以及兩個頂點之間的邊;
(4)graph.degrees:圖中所有頂點的度;
(5)graph.inDegrees:圖中所有頂點的入度;
(6)graph.outDegrees:圖中所有頂點的出度;
對這些屬性的操作,直接上代碼:
//圖的屬性操作 println("*************************************************************") println("屬性演示") println("*************************************************************") // 方法一 println("找出圖中年齡大於20的頂點方法之一:") graph.vertices.filter{case(id,(name,age)) => age>20}.collect.foreach { case(id,(name,age)) => println(s"$name is $age") } // 方法二 println("找出圖中年齡大於20的頂點方法之二:") graph.vertices.filter(v => v._2._2>20).collect.foreach { v => println(s"${v._2._1} is ${v._2._2}") } // 邊的操作 println("找出圖中屬性大於3的邊:") graph.edges.filter(e => e.attr>3).collect.foreach(e => println(s"${e.srcId} to ${e.dstId} att ${e.attr}")) println // Triplet操作 println("列出所有的Triples:") for(triplet <- graph.triplets.collect){ println(s"${triplet.srcAttr._1} likes ${triplet.dstAttr._1}") } println println("列出邊屬性>3的Triples:") for(triplet <- graph.triplets.filter(t => t.attr > 3).collect){ println(s"${triplet.srcAttr._1} likes ${triplet.dstAttr._1}") } println // Degree操作 println("找出圖中最大的出度,入度,度數:") def max(a:(VertexId,Int), b:(VertexId,Int)):(VertexId,Int) = { if (a._2>b._2) a else b } println("Max of OutDegrees:" + graph.outDegrees.reduce(max)) println("Max of InDegrees:" + graph.inDegrees.reduce(max)) println("Max of Degrees:" + graph.degrees.reduce(max)) println
運行結果:
Using Spark's default log4j profile: org/apache/spark/log4j-defaults.properties
17/05/22 20:45:35 INFO Slf4jLogger: Slf4jLogger started
17/05/22 20:45:35 INFO Remoting: Starting remoting
17/05/22 20:45:35 INFO Remoting: Remoting started; listening on addresses :[akka.tcp://[email protected]:53375]
*************************************************************
屬性演示
*************************************************************
找出圖中年齡大於20的頂點方法之一:
Peter is 32
Alice is 38
Charlie is 55
Mike is 35
找出圖中年齡大於20的頂點方法之二:
Peter is 32
Alice is 38
Charlie is 55
Mike is 35
找出圖中屬性大於3的邊:
3 to 2 att 7
5 to 3 att 8
5 to 6 att 8
列出所有的Triples:
Henry likes Alice
Henry likes Peter
Charlie likes Henry
Charlie likes Kate
Peter likes Alice
Mike likes Henry
Mike likes Charlie
Mike likes Kate
列出邊屬性>3的Triples:
Charlie likes Henry
Mike likes Charlie
Mike likes Kate
找出圖中最大的出度,入度,度數:
Max of OutDegrees:(5,3)
Max of InDegrees:(1,2)
Max of Degrees:(2,4)