以前處理的數據都是以記錄爲中心,圖計算以圖的方式來展示數據,更多的考慮的是頂點和邊之間的關係。
spark graphx中採用RDPG Resilient Distributed Property Graphx(彈性分佈式屬性圖)來進行抽象。
1.關鍵抽象:
1.頂點:RDD[(VertexId,VD)]
VertexId是Long類型,表示頂點的ID(主鍵),VD表示類型參數,可以是任意類型,類似於RDD[T],表示的是該頂點的屬性。
VertexRDD[VD]繼承了RDD[(VertexId, VD)] ,它是頂點的另一種表示方式,在內部的計算上提供了很多的優化,還有一些更高級的API。
2.邊:RDD[Edge[ED]]
case class Edge[@specialized(Char, Int, Boolean, Byte, Long, Float, Double) ED] (var srcId: VertexId = 0, var dstId: VertexId = 0, var attr: ED = null.asInstanceOf[ED])
表示邊,Edge中有三個形式參數,srcId表示源頂點ID,dstId表示目標頂點的ID,attr表示屬性,屬性的類型爲ED,可以是任意類型。
EdgeRDD[ED]繼承了RDD[Edge[ED]],他是邊的另外一種表示方式,在內部的計算上提供了很多的優化,還有一些高級的API。
3.三元組:RDD[EdgeTriplet[VD,ED]]
class EdgeTriplet[VD, ED] extends Edge[ED]
它表示一個三元組,比邊多了兩個頂點的屬性。
srcId、srcAttr、attr、dstId、dstAttr
4.圖:Graph[VD,ED]
abstract class Graph[VD: ClassTag, ED: ClassTag]
VD是頂點的屬性、ED是邊的屬性。
sparkGraphx直接sparkContext來和spark集羣進行連接。
2.程序怎麼寫
- 流程如下:
- 直接創建sparkConf->sparkContext
- 創建頂點RDD RDD[(VertexId,VD)]
- 創建邊的RDD RDD[Edge[ED]]
- 根據邊和頂點創建圖Graph
- 對圖進行計算
- 關閉sparkContext
- 簡單代碼如下:
package com.dengdan
import org.apache.spark.graphx.{Edge, Graph, VertexId}
import org.apache.spark.rdd.RDD
import org.apache.spark.{SparkConf, SparkContext}
object HelloWord extends App {
//創建sparkConf
val sparkConf = new SparkConf().setAppName("graphx").setMaster("local[*]")
//創建sparkContext
val sc = new SparkContext(sparkConf)
//業務邏輯
//創建頂點
val vertextRDD: RDD[(VertexId, (String, String))] = sc.makeRDD(Array(
(3L, ("rxin", "student")),
(7L, ("jgonzal", "postdoc")),
(5L, ("fanklin", "professor")),
(2L, ("istoica", "professor"))))
//創建邊
val edgesRDD: RDD[Edge[String]] = sc.makeRDD(Array(
Edge(3L, 7L, "Collaborator"),
Edge(5L, 3L, "Advisor"),
Edge(2L, 5L, "Colleague"),
Edge(5L, 7L, "PI")))
//建圖
val graph = Graph(vertextRDD, edgesRDD)
//返回三元組,進行RDD的操作
graph.triplets.collect().foreach { edgeTriplet =>
println(s"[src:]${edgeTriplet.srcId} ${edgeTriplet.srcAttr} [edge:] ${edgeTriplet.attr} [dst:]${edgeTriplet.dstId} ${edgeTriplet.dstAttr}")
}
//關閉連接
sc.stop()
}