Spark GraphX圖算法

2018-11-26 16:34 更新

Spark GraphX圖算法

GraphX包括一組圖算法來簡化分析任務(wù)。這些算法包含在org.apache.spark.graphx.lib包中,可以被直接訪問。

PageRank算法

PageRank度量一個圖中每個頂點的重要程度,假定從u到v的一條邊代表v的重要性標(biāo)簽。例如,一個Twitter用戶被許多其它人粉,該用戶排名很高。GraphX帶有靜態(tài)和動態(tài)PageRank的實現(xiàn)方法,這些方法在PageRank object中。靜態(tài)的PageRank運行固定次數(shù)的迭代,而動態(tài)的PageRank一直運行,直到收斂。[GraphOps]()允許直接調(diào)用這些算法作為圖上的方法。

GraphX包含一個我們可以運行PageRank的社交網(wǎng)絡(luò)數(shù)據(jù)集的例子。用戶集在graphx/data/users.txt中,用戶之間的關(guān)系在graphx/data/followers.txt中。我們通過下面的方法計算每個用戶的PageRank。

// Load the edges as a graph
val graph = GraphLoader.edgeListFile(sc, "graphx/data/followers.txt")
// Run PageRank
val ranks = graph.pageRank(0.0001).vertices
// Join the ranks with the usernames
val users = sc.textFile("graphx/data/users.txt").map { line =>
  val fields = line.split(",")
  (fields(0).toLong, fields(1))
}
val ranksByUsername = users.join(ranks).map {
  case (id, (username, rank)) => (username, rank)
}
// Print the result
println(ranksByUsername.collect().mkString("\n"))

連通體算法

連通體算法用id標(biāo)注圖中每個連通體,將連通體中序號最小的頂點的id作為連通體的id。例如,在社交網(wǎng)絡(luò)中,連通體可以近似為集群。GraphX在ConnectedComponents object中包含了一個算法的實現(xiàn),我們通過下面的方法計算社交網(wǎng)絡(luò)數(shù)據(jù)集中的連通體。

/ Load the graph as in the PageRank example
val graph = GraphLoader.edgeListFile(sc, "graphx/data/followers.txt")
// Find the connected components
val cc = graph.connectedComponents().vertices
// Join the connected components with the usernames
val users = sc.textFile("graphx/data/users.txt").map { line =>
  val fields = line.split(",")
  (fields(0).toLong, fields(1))
}
val ccByUsername = users.join(cc).map {
  case (id, (username, cc)) => (username, cc)
}
// Print the result
println(ccByUsername.collect().mkString("\n"))

三角形計數(shù)算法

一個頂點有兩個相鄰的頂點以及相鄰頂點之間的邊時,這個頂點是一個三角形的一部分。GraphX在TriangleCount object中實現(xiàn)了一個三角形計數(shù)算法,它計算通過每個頂點的三角形的數(shù)量。需要注意的是,在計算社交網(wǎng)絡(luò)數(shù)據(jù)集的三角形計數(shù)時,TriangleCount需要邊的方向是規(guī)范的方向(srcId < dstId),并且圖通過Graph.partitionBy分片過。

// Load the edges in canonical order and partition the graph for triangle count
val graph = GraphLoader.edgeListFile(sc, "graphx/data/followers.txt", true).partitionBy(PartitionStrategy.RandomVertexCut)
// Find the triangle count for each vertex
val triCounts = graph.triangleCount().vertices
// Join the triangle counts with the usernames
val users = sc.textFile("graphx/data/users.txt").map { line =>
  val fields = line.split(",")
  (fields(0).toLong, fields(1))
}
val triCountByUsername = users.join(triCounts).map { case (id, (username, tc)) =>
  (username, tc)
}
// Print the result
println(triCountByUsername.collect().mkString("\n"))
以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號