企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
```scala Graph[VD,ED] // 使用边集合与顶点集合构建图 VertexRDD[VD] // 操作顶点的RDD视图 EdgeRDD[ED] // 操作边的RDD视图 EdgeTriplet[VD,ED] // 表示顶点与边的集合 Edge:样例类,表示一条边 VertexId:Long的别名,顶点的Id ``` 下面使用Scala代码构建如下图: ![](https://img.kancloud.cn/4f/c9/4fc971d0f47c7a0290f0614faaead7bd_967x171.png) **构图方式1: `SparkContext.parallelize/SparkContext.makeRDD`先创建顶点集合和边集合RDD,再构建图。**(常用) ```scala import org.apache.spark.SparkContext import org.apache.spark.graphx.{Edge, Graph, VertexId} import org.apache.spark.rdd.RDD import org.apache.spark.sql.SparkSession object GraphxAPI { def main(args: Array[String]): Unit = { val spark:SparkSession = SparkSession.builder() .appName(this.getClass.getName) .master("local[4]") .getOrCreate() val sc:SparkContext = spark.sparkContext import spark.implicits._ // 1. 顶点集合 (顶点Id, 顶点的值) val vertices:RDD[(VertexId, Int)] = sc.makeRDD(Seq((1L, 1), (2L, 2), (3L, 3))) // 2. 边集合 (开始顶点Id, 目的顶点Id, 两个顶点的边的值) val edges:RDD[Edge[Int]] = sc.makeRDD(Seq(Edge(1L, 2L, 1), Edge(2L, 3L, 2))) // 3. 使用顶点集合和边集合构建图,Graph[点值类型, 边值类型] val graph:Graph[Int, Int] = Graph(vertices, edges) // 打印图的顶点,(顶点id, 顶点值) graph.vertices.foreach(x=>println(s"(Id:${x._1}, attr:${x._2})")) // (Id:3, attr:3) // (Id:1, attr:1) // (Id:2, attr:2) // 打印图的边, (开始顶点, 目的顶点, 两个顶点的边的值) graph.edges.foreach(x=>println(s"(srcId:${x.srcId}, dstId:${x.dstId}, attr:${x.attr})")) // (srcId:1, dstId:2, attr:1) // (srcId:2, dstId:3, attr:2) // triplets获取带有属性的点和属性的边 graph.triplets.foreach(x=>println(x.toString())) // ((srcId, srcAttr), (dstId, dstAttr), srcId到dstId的边的值) // ((2,2),(3,3),2) // ((1,1),(2,2),1) } } ``` <br/> **构图方式2:加载外部文件构建图** (1)数据的格式为`srcId dstId`,顶点和边的Attr都默认为1。 ```txt 2 1 4 1 1 2 ``` (2)代码 ```scala import org.apache.spark.SparkContext import org.apache.spark.sql.SparkSession object GraphLoaderFile { def main(args: Array[String]): Unit = { val spark:SparkSession = SparkSession.builder() .appName(this.getClass.getName) .master("local[4]") .getOrCreate() val sc:SparkContext = spark.sparkContext import spark.implicits._ import org.apache.spark.graphx.GraphLoader val graph = GraphLoader.edgeListFile(sc, "file:///E:\\hadoop\\input\\graph.txt") // 打印图的顶点,(顶点id, 顶点值) graph.vertices.foreach(x=>println(s"(Id:${x._1}, attr:${x._2})")) // (Id:4, attr:1) // (Id:2, attr:1) // (Id:1, attr:1) // 打印图的边, (开始顶点, 目的顶点, 两个顶点的边的值) graph.edges.foreach(x=>println(s"(srcId:${x.srcId}, dstId:${x.dstId}, attr:${x.attr})")) // (srcId:2, dstId:1, attr:1) // (srcId:1, dstId:2, attr:1) // (srcId:4, dstId:1, attr:1) // triplets获取带有属性的点和属性的边 graph.triplets.foreach(x=>println(x.toString())) // ((srcId, srcAttr), (dstId, dstAttr), srcId到dstId的边的值) // ((2,1),(1,1),1) // ((1,1),(2,1),1) // ((4,1),(1,1),1) } } ```