Advertisement

Spark内置算法:Connected Components算法解析及案例和Triangle Counting算法解析及案例

阅读量:

1.Connected Components

含义:连通分量算法用图的最低编号顶点的ID标记图的每个连通分量。例如,在社交网络中,连接的组件可以近似于群集。

案例:

复制代码
 package sparkGraphX

    
 import org.apache.spark.graphx.{GraphLoader, VertexId, VertexRDD}
    
 import org.apache.spark.{SparkConf, SparkContext}
    
 object connectionTest {
    
   def main(args: Array[String]): Unit = {
    
     val conf = new SparkConf().setAppName("SimpleGraphX").setMaster("local")
    
     val sc = new SparkContext(conf)
    
     sc.setLogLevel("WARN")
    
  
    
     // Load the graph as in the PageRank example
    
     val graph = GraphLoader.edgeListFile(sc, "D:/testData/vertices.txt")
    
     // Find the connected components
    
     val cc: VertexRDD[VertexId] = graph.connectedComponents().vertices
    
     cc.collect.foreach(println(_))
    
 //下面的代码就是将顶点的名称与编号建立对应关系,最后将顶点名称与值打印出来。
    
     val users = sc.textFile("D:/testData/user.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"))
    
  
    
   }
    
 }

结果: 顶点图:

解析:Connected Components算法可以找出孤立的点。从结果可知,图分为两部分。1,4,8,2一组。6,3,7一组。

2.Triangle Counting

含义:当一个顶点有两个相邻的顶点之间有一条边时,它就是三角形的一部分。GraphX在TriangleCount对象中实现了一个三角形计数算法,该算法确定通过每个顶点的三角形数,从而提供了聚类的度量。注意,三角形计数要求边处于规范方向(srcId<dstId),并使用graph.partitionBy对图形进行分区。

案例:

复制代码
 package sparkGraphX

    
 import org.apache.spark.graphx.{GraphLoader, PartitionStrategy}
    
 import org.apache.spark.{SparkConf, SparkContext}
    
 object TriangleCounting {
    
   def main(args: Array[String]): Unit = {
    
     val conf = new SparkConf().setAppName("SimpleGraphX").setMaster("local")
    
     val sc = new SparkContext(conf)
    
     sc.setLogLevel("WARN")
    
  
    
     // Load the edges in canonical order and partition the graph for triangle count
    
     val graph = GraphLoader.edgeListFile(sc, "D:/testData/vertices.txt", true)
    
       .partitionBy(PartitionStrategy.RandomVertexCut)
    
     // Find the triangle count for each vertex
    
     val triCounts = graph.triangleCount().vertices
    
     triCounts.collect.foreach(println(_))
    
 //下面的代码就是将顶点的名称与编号建立对应关系,最后将顶点名称与值打印出来。
    
     val users = sc.textFile("D:/testData/user.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"))
    
  
    
   }
    
 }

结果: 顶点图:

结果解析:Triangle Counting算法找出图中的三角形,如图点4,不与其他点构成三角形所以为0,而1,2,8与6,3,7都构成三角形所以值为1 。

全部评论 (0)

还没有任何评论哟~