5. 圖的轉換操作 圖的轉換操作主要有以下的方法: (1) Graph.mapVertices():對圖的頂點進行轉換,返回一張新圖; (2) Graph.mapEdges():對圖的邊進行轉換,返回一張新圖。 代碼: 運行結果: 6. 圖的結構操作 圖的結構操作主要有: (1) Graph.sub ...
5. 圖的轉換操作
圖的轉換操作主要有以下的方法:
(1) Graph.mapVertices():對圖的頂點進行轉換,返回一張新圖;
(2) Graph.mapEdges():對圖的邊進行轉換,返回一張新圖。
代碼:
// 轉換操作 println("*************************************************************") println("轉換操作") println("*************************************************************") println("頂點的轉換操作,頂點age+10:") graph.mapVertices{case(id,(name,age)) => (id,(name,age+10))}.vertices.collect.foreach(v => println(s"${v._2._1} is${v._2._2}")) println("邊的轉換操作,邊的屬性*2:") graph.mapEdges(e => e.attr*2).edges.collect.foreach(e => println(s"${e.srcId} to ${e.dstId} att ${e.attr}"))
運行結果:
*************************************************************
轉換操作
*************************************************************
頂點的轉換操作,頂點age+1:
4 is(Peter,33)
6 is(Kate,24)
2 is(Henry,28)
1 is(Alice,39)
3 is(Charlie,56)
5 is(Mike,36)
邊的轉換操作,邊的屬性*3:
2 to 1 att 15
2 to 4 att 6
3 to 2 att 21
3 to 6 att 9
4 to 1 att 3
5 to 2 att 9
5 to 3 att 24
5 to 6 att 24
6. 圖的結構操作
圖的結構操作主要有:
(1) Graph.subgraph():求圖的子圖,從圖中選出一些頂點,這些頂點以及相應的邊就構成了一張子圖。
代碼:
println("*************************************************************") println("結構操作") println("*************************************************************") println("頂點年紀>25的子圖:") val subGraph = graph.subgraph(vpred = (id,vd) => vd._2 >= 25) println("子圖所有頂點:") subGraph.vertices.collect.foreach(v => println(s"${v._2._1} is ${v._2._2}")) println println("子圖所有邊:") subGraph.edges.collect.foreach(e => println(s"${e.srcId} to ${e.dstId} att ${e.attr}"))
從圖中選出年齡大於等於25歲的頂點。運行結果:
*************************************************************
結構操作
*************************************************************
頂點年紀>25的子圖:
子圖所有頂點:
Peter is 32
Henry is 27
Alice is 38
Charlie is 55
Mike is 35
子圖所有邊:
2 to 1 att 5
2 to 4 att 2
3 to 2 att 7
4 to 1 att 1
5 to 2 att 3
5 to 3 att 8
7. 圖的連接操作
圖的連接操作主要有以下方法:
(1) Graph.joinVertices(Graph):對於兩個圖中都存在的頂點進行轉換;
(2) Graph.outerJoinVertices(Graph):和(1)類似,區別在於一個頂點只在前一個圖中有,後一個圖裡面沒有,就將這個頂點的屬性設為Null。
代碼:
// 連接操作 println("*************************************************************") println("連接操作") println("*************************************************************") case class User(name:String, age:Int, inDeg:Int, outDeg:Int) // 創建一個新圖,頂點VD的數據類型為User,並從graph做類型轉換 val initialUserGraph:Graph[User, Int] = graph.mapVertices{case(id,(name,age)) => User(name,age,0,0)} // initialUserGraph與inDegrees,outDegrees(RDD)進行連接,並修改initialUserGraph中inDeg值,outDeg值 val userGraph = initialUserGraph.outerJoinVertices(initialUserGraph.inDegrees){ case(id, u, inDegOpt) => User(u.name, u.age, inDegOpt.getOrElse(0), u.outDeg)}.outerJoinVertices(initialUserGraph.outDegrees){ case(id, u, outDegOpt) => User(u.name, u.age, u.inDeg, outDegOpt.getOrElse(0)) } println("連接圖的屬性:") userGraph.vertices.collect.foreach(v => println(s"${v._2.name} inDeg:${v._2.inDeg} outDeg:${v._2.outDeg}")) println("出度和入度相同的人員:") userGraph.vertices.filter{ case(id, v) => v.inDeg==v.outDeg }.collect.foreach{ case(id, property) => println(property.name) } println
其實是一個圖分別和自己的入度圖、出度圖進行連接操作,以便把頂點的出度和入度寫入頂點的屬性。
運行結果:
*************************************************************
連接操作
*************************************************************
連接圖的屬性:
Peter inDeg:1 outDeg:1
Kate inDeg:2 outDeg:0
Henry inDeg:2 outDeg:2
Alice inDeg:2 outDeg:0
Charlie inDeg:1 outDeg:2
Mike inDeg:0 outDeg:3
出度和入度相同的人員:
Peter
Henry