首页 > 代码库 > Spark GraphX实例(2)
Spark GraphX实例(2)
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 152 to 4 att 63 to 2 att 213 to 6 att 94 to 1 att 35 to 2 att 95 to 3 att 245 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 32Henry is 27Alice is 38Charlie is 55Mike is 35子图所有边:2 to 1 att 52 to 4 att 23 to 2 att 74 to 1 att 15 to 2 att 35 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:1Kate inDeg:2 outDeg:0Henry inDeg:2 outDeg:2Alice inDeg:2 outDeg:0Charlie inDeg:1 outDeg:2Mike inDeg:0 outDeg:3出度和入度相同的人员:PeterHenry
Spark GraphX实例(2)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。