graphx操作实例08-connectedComponents

     graphx创建的过程是将顶点和边全部丢进去,然后由spark构建graph,那么问题来了,所有顶点与所有边全部丢进去,要想得到某一个连通子图怎么办connectedComponents 就可以来搞定这个。具体上代码例子

import org.apache.spark._  
import org.apache.spark.SparkContext  
import org.apache.spark.SparkContext._  
import org.apache.spark.graphx._  
import org.apache.spark.rdd.RDD  
  
import scala.reflect.ClassTag  
  
object Day11 {  
  
  def main(args: Array[String]) = {  
  
    val conf = new SparkConf()  
    val sc = new SparkContext("local", "test", conf)  
  
    // day11.tsv  
    // 1 2  
    // 2 3  
    // 3 1  
    // 4 5  
    // 5 6  
    // 6 7  
    val graph = GraphLoader.edgeListFile(sc, "graphdata/day11.tsv").cache()  
  
    println("\n\n~~~~~~~~~ Confirm Vertices Internal of graph ")  
    graph.vertices.collect.foreach(println(_))  
    // (4,1)  
    // (6,1)  
    // (2,1)  
    // (1,1)  
    // (3,1)  
    // (7,1)  
    // (5,1)  
  
    println("\n\n~~~~~~~~~ Confirm Edges Internal of graph ")  
    graph.edges.collect.foreach(println(_))  
    // Edge(1,2,1)  
    // Edge(2,3,1)  
    // Edge(3,1,1)  
    // Edge(4,5,1)  
    // Edge(5,6,1)  
    // Edge(6,7,1)  
    // 1,2,3相连,4,5,6,7相连  
  
    // 取连通图,连通图以图中最小Id作为label给图中顶点打属性  
    val cc:Graph[Long, Int] = graph.connectedComponents  
  
    println("\n\n~~~~~~~~~ Confirm Vertices Connected Components ")  
    cc.vertices.collect.foreach(println(_))  
    // (4,4)  
    // (6,4)  
    // (2,1)  
    // (1,1)  
    // (3,1)  
    // (7,4)  
    // (5,4)  
  
    // 取出id为2的顶点的label  
    val cc_label_of_vid_2:Long = cc.vertices.filter{case (id, label) => id == 2}.first._2  
  
    println("\n\n~~~~~~~~~ Confirm Connected Components Label of Vertex id 2")  
    println(cc_label_of_vid_2)  
    // 1  
  
    // 取出相同类标的顶点  
    val vertices_connected_with_vid_2:RDD[(Long, Long)] = cc.vertices.filter{case (id, label) => label == cc_label_of_vid_2}  
  
    println("\n\n~~~~~~~~~ Confirm vertices_connected_with_vid_2")  
    vertices_connected_with_vid_2.collect.foreach(println(_))  
    // (2,1)  
    // (1,1)  
    // (3,1)  
  
    val vids_connected_with_vid_2:RDD[Long] = vertices_connected_with_vid_2.map(v => v._1)  
    println("\n\n~~~~~~~~~ Confirm vids_connected_with_vid_2")  
    vids_connected_with_vid_2.collect.foreach(println(_))  
    // 2  
    // 1  
    // 3  
  
    val vids_list:Array[Long] = vids_connected_with_vid_2.collect  
    // 取出子图  
    val graph_include_vid_2 = graph.subgraph(vpred = (vid, attr) => vids_list.contains(vid))  
  
    println("\n\n~~~~~~~~~ Confirm graph_include_vid_2 ")  
    graph_include_vid_2.vertices.collect.foreach(println(_))  
    // (2,1)  
    // (1,1)  
    // (3,1)  
  
    sc.stop  
  }  
  
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值