spark-19.sparkGraphx_1_sparkGraphx概述

以前處理的數據都是以記錄爲中心,圖計算以圖的方式來展示數據,更多的考慮的是頂點和邊之間的關係。
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.程序怎麼寫

  • 流程如下:
  1. 直接創建sparkConf->sparkContext
  2. 創建頂點RDD RDD[(VertexId,VD)]
  3. 創建邊的RDD RDD[Edge[ED]]
  4. 根據邊和頂點創建圖Graph
  5. 對圖進行計算
  6. 關閉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()
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章