1. 程式人生 > >十、spark graphx的scala示例

十、spark graphx的scala示例

簡介

spark graphx官網:http://spark.apache.org/docs/latest/graphx-programming-guide.html#overview

spark graphx是基於spark core之上的一個圖計算元件,graphx擴充套件了spark RDD,是spark對於圖計算的一種抽象。

這裡的圖,不是“圖畫”的意思,是一種資料結構。這種資料結構由“點”和“線”組成,拿使用者關係圖來說,“點”描述的就是使用者,“線”描述的就是這些使用者之間的關係,所以由“點”和“線”組成了一張“使用者關係圖”,如圖:

vertex table: 點,是由ID和Property屬性組成的,ID必須是Long型別

edge table:線,是由起始ID,終點ID,property屬性組成的,ID也必須為Long型別

property graph:圖,由vertex和edge的資料,就可以構建出一張graph圖資料結構

而spark graphx就是將這種資料結構創建出來,並提供簡單易用的API來操作這個資料結構,如:查詢、轉換、關聯、聚合等

程式碼示例

下面是scala語言的程式碼示例:

import org.apache.spark.graphx.{Edge, Graph}
import org.apache.spark.rdd.RDD
import
org.apache.spark.{SparkConf, SparkContext} /** * @Description spark graphx demo * @Author lay * @Date 2018/12/09 20:19 */ object SparkGraphxDemo { var conf: SparkConf = _ var sc: SparkContext = _ var userData: Array[String] = Array("1 lay", "2 marry", "3 gary") var relationData: Array[String]
= Array("1 2 朋友", "1 3 同事", "2 3 姐弟") var userRDD: RDD[(Long, String)] = _ var relationRDD: RDD[Edge[String]] = _ def init(): Unit = { conf = new SparkConf().setAppName("spark graphx demo").setMaster("local") sc = new SparkContext(conf) } def loadRdd(): Unit = { userRDD = sc.parallelize(userData).map { x => val lines = x.split(" "); (lines(0).toLong, lines(1)) } relationRDD = sc.parallelize(relationData).map { x => val lines = x.split(" "); Edge(lines(0).toLong, lines(1).toLong, lines(2)) } } def main(args: Array[String]): Unit = { // 初始化 init() // 載入rdd loadRdd() // 建立graph var graph = Graph(userRDD, relationRDD) // 找出和lay有關係的人 graph.triplets.filter(x => x.srcId == 1L).foreach{x => printf("%s是%s的%s", x.dstAttr, x.srcAttr, x.attr);println()} } }

我們將userRDD和relationRDD構建成了一個抽象結構Graph,然後過濾出了和lay有關係的人,並迴圈打印出結果,如下:

marry是lay的朋友
gary是lay的同事