GraphX之Connected Components算法及Spark实现

  • Connected Components
  • Demo
  • 扩展

Connected Components

源码

Compute the connected component membership of each vertex and return a graph with the vertex value containing the lowest vertex id in the connected component containing that vertex.

Demo

  • links.csv
1,2,friend
1,3,sister
2,4,brother
3,2,boss
4,5,client
1,9,friend
6,7,cousin
7,9,coworker
8,9,father
10,11,colleague
10,12,colleague
11,12,colleague
  • people.csv
4,Dave,25
6,Faith,21
8,Harvey,47
2,Bob,18
1,Alice,20
3,Charlie,30
7,George,34
9,Ivy,21
5,Eve,30
10,Lily,35
11,Helen,35
12,Ann,35
  • 图结构
  • 代码
package nj.zb.kb09.suanfaimport org.apache.spark.SparkContext
import org.apache.spark.rdd.RDD
import org.apache.spark.sql.SparkSessionimport org.apache.spark.graphx._
object ConnectedComponents {def main(args: Array[String]): Unit = {val spark: SparkSession = SparkSession.builder().master("local[*]").appName("ConnectedComponents").getOrCreate()val sc: SparkContext = spark.sparkContext//定义样例类case class Person(name:String,age:Int)//读取people.csv文件val people: RDD[String] = sc.textFile("in/people.csv")//根据“,”进行切割,变成二元组的形式val peopleRDD: RDD[(VertexId, Person)] = people.map(x=>x.split(",")).map(row=>(row(0).toInt,Person(row(1),row(2).toInt)))peopleRDD.collect.foreach(println)println("----------------------")//读取links.csv文件val links: RDD[String] = sc.textFile("in/links.csv")//根据“,”进行切割val linksRDD: RDD[Edge[String]] = links.map({x=> val row=x.split(",") ;Edge(row(0).toInt,row(1).toInt,row(2))})linksRDD.collect.foreach(println)println("-----------------------")//生成Graphval tinySocial: Graph[Person, String] = Graph(peopleRDD,linksRDD)val cc: Graph[VertexId, String] = tinySocial.connectedComponents()cc.triplets.collect.foreach(println)}
}

结果展示:

(4,Person(Dave,25))
(6,Person(Faith,21))
(8,Person(Harvey,47))
(2,Person(Bob,18))
(1,Person(Alice,20))
(3,Person(Charlie,30))
(7,Person(George,34))
(9,Person(Ivy,21))
(5,Person(Eve,30))
(10,Person(Lily,35))
(11,Person(Helen,35))
(12,Person(Ann,35))
----------------------
Edge(1,2,friend)
Edge(1,3,sister)
Edge(2,4,brother)
Edge(3,2,boss)
Edge(4,5,client)
Edge(1,9,friend)
Edge(6,7,cousin)
Edge(7,9,coworker)
Edge(8,9,father)
Edge(10,11,colleague)
Edge(10,12,colleague)
Edge(11,12,colleague)
-----------------------
((1,1),(2,1),friend)
((1,1),(3,1),sister)
((1,1),(9,1),friend)
((2,1),(4,1),brother)
((3,1),(2,1),boss)
((4,1),(5,1),client)
((6,1),(7,1),cousin)
((7,1),(9,1),coworker)
((8,1),(9,1),father)
((10,10),(11,10),colleague)
((10,10),(12,10),colleague)
((11,10),(12,10),colleague)

从结果中可以看到通过计算之后的图,每个顶点多了一个属性,这个属性表示的就是这个顶点所在的连通图中的最小顶点id。例如顶点11所在的连通图中的最小顶点id是10,顶点4所在的连通图中的最小顶点id是1

连通图:
在图论中,连通图基于连通的概念。
在一个无向图G中,若从顶点i到顶点j有路径相连(当然从j到i也有路径),则称i和j是连通的。
如果G是有向图,那么连接i和j的路径中所有的边必须同向。
如果图中任意两点都是连通的,那么图被称作连通图。如果此图是有向图,则称为强连通图(注意:需要双向都有路径)。
图的连通性是图的基本性质。

扩展

经过connectedComponents得到的结果,可以知道哪些顶点在一个连通图中,这样就可以将一个大图拆分成若干个连通子图。

package nj.zb.kb09.suanfaimport org.apache.spark.SparkContext
import org.apache.spark.rdd.RDD
import org.apache.spark.sql.SparkSessionimport org.apache.spark.graphx._
object ConnectedComponents {def main(args: Array[String]): Unit = {val spark: SparkSession = SparkSession.builder().master("local[*]").appName("ConnectedComponents").getOrCreate()val sc: SparkContext = spark.sparkContext//定义样例类case class Person(name:String,age:Int)//读取people.csv文件val people: RDD[String] = sc.textFile("in/people.csv")//根据“,”进行切割,变成二元组的形式val peopleRDD: RDD[(VertexId, Person)] = people.map(x=>x.split(",")).map(row=>(row(0).toLong,Person(row(1),row(2).toInt)))peopleRDD.collect.foreach(println)println("----------------------")//读取links.csv文件val links: RDD[String] = sc.textFile("in/links.csv")//根据“,”进行切割val linksRDD: RDD[Edge[String]] = links.map({ x=> val row=x.split(",") ;Edge(row(0).toInt,row(1).toInt,row(2))})linksRDD.collect.foreach(println)println("-----------------------")//生成Graphval tinySocial: Graph[Person, String] = Graph(peopleRDD,linksRDD)val cc: Graph[VertexId, String] = tinySocial.connectedComponents()cc.triplets.collect.foreach(println)println("-----------------------")val newGraph: Graph[(VertexId, String, PartitionID), String] = cc.outerJoinVertices(peopleRDD)((id,cc,p)=>(cc,p.get.name,p.get.age))cc.vertices.map(_._2).collect.distinct.foreach(id=>{val sub: Graph[(VertexId, String, PartitionID), String] =newGraph.subgraph(vpred = (id1, id2)=>id2._1==id)sub.triplets.collect.foreach(println)println()})}
}

结果展示:

(4,Person(Dave,25))
(6,Person(Faith,21))
(8,Person(Harvey,47))
(2,Person(Bob,18))
(1,Person(Alice,20))
(3,Person(Charlie,30))
(7,Person(George,34))
(9,Person(Ivy,21))
(5,Person(Eve,30))
(10,Person(Lily,35))
(11,Person(Helen,35))
(12,Person(Ann,35))
----------------------
Edge(1,2,friend)
Edge(1,3,sister)
Edge(2,4,brother)
Edge(3,2,boss)
Edge(4,5,client)
Edge(1,9,friend)
Edge(6,7,cousin)
Edge(7,9,coworker)
Edge(8,9,father)
Edge(10,11,colleague)
Edge(10,12,colleague)
Edge(11,12,colleague)
-----------------------
((1,1),(2,1),friend)
((1,1),(3,1),sister)
((1,1),(9,1),friend)
((2,1),(4,1),brother)
((3,1),(2,1),boss)
((4,1),(5,1),client)
((6,1),(7,1),cousin)
((7,1),(9,1),coworker)
((8,1),(9,1),father)
((10,10),(11,10),colleague)
((10,10),(12,10),colleague)
((11,10),(12,10),colleague)
-----------------------
((1,(1,Alice,20)),(2,(1,Bob,18)),friend)
((1,(1,Alice,20)),(3,(1,Charlie,30)),sister)
((1,(1,Alice,20)),(9,(1,Ivy,21)),friend)
((2,(1,Bob,18)),(4,(1,Dave,25)),brother)
((3,(1,Charlie,30)),(2,(1,Bob,18)),boss)
((4,(1,Dave,25)),(5,(1,Eve,30)),client)
((6,(1,Faith,21)),(7,(1,George,34)),cousin)
((7,(1,George,34)),(9,(1,Ivy,21)),coworker)
((8,(1,Harvey,47)),(9,(1,Ivy,21)),father)((10,(10,Lily,35)),(11,(10,Helen,35)),colleague)
((10,(10,Lily,35)),(12,(10,Ann,35)),colleague)
((11,(10,Helen,35)),(12,(10,Ann,35)),colleague)

分析:
1、通过connectedComponents得到的新图的顶点属性已经没有了原始的那些信息,所以需要和原始信息做一个join,例如:val newGraph: Graph[(VertexId, String, PartitionID), String] = cc.outerJoinVertices(peopleRDD)((id,cc,p)=>(cc,p.get.name,p.get.age))
2、cc.vertices.map(_._2).collect.distinct会得到所有连通图中id最小的顶点编号
3、通过连通图中最小顶点编号,使用subgraph方法得到每个连通子图

大数据——GraphX之Connected Components算法及Spark实现相关推荐

  1. 大数据时代先要满足算法而不是客户的需求

    <如何免费获取线上流量>系列课程之一 (注:以下内容是根据张进老师在2020年12月10号在善书院举办的一期企业经营沙龙上,所做的<企业如何获取线上的免费流量>演讲整理出的部分 ...

  2. 大数据预测的基本原理_大数据需要掌握的基本算法

    大数据需要会的基本算法 前言 数学就像一条章鱼,它有触手可以触及到几乎每个学科上面.虽然大部分人在上学的时候有系统的学习,但都没有进行深入的研究和运用,只是拿来拓展自己的思维逻辑.但是如果你想从事数学 ...

  3. Spark商业案例与性能调优实战100课》第20课:大数据性能调优的本质和Spark性能调优要点分析

    Spark商业案例与性能调优实战100课>第20课:大数据性能调优的本质和Spark性能调优要点分析 基于本元想办法,大智若愚,大巧若拙!深入彻底的学习spark技术内核!

  4. 人工智能、大数据的广泛应用,算法推荐如何守好边界

    来源:人民数据 本文共2000字,建议阅读5分钟 人工智能.大数据的广泛应用,给互联网平台带来了自动化的算法技术. 人工智能.大数据的广泛应用,给互联网平台带来了自动化的算法技术.一方面,互联网平台利 ...

  5. 大数据培训技术Kylin核心算法逐层构建算法

    核心算法 Kylin的工作原理就是对数据模型做Cube预计算,并利用计算的结果加速查询: 1)指定数据模型,定义维度和度量: 2)预计算Cube,计算所有Cuboid并保存为物化视图: 预计算过程是K ...

  6. 带你走进微博背后的大数据原理:微博推荐算法

    在介绍微博推荐算法之前,我们先聊一聊推荐系统和推荐算法.有这样一些问题:推荐系统适用哪些场景?用来解决什么问题.具有怎样的价值?效果如何衡量? 推荐系统诞生很早,但真正被大家所重视,缘起于以" ...

  7. 大数据Hadoop学习之——TF-IDF算法实现

    一.算法说明 1.词频TF:是指给定词语在给定文件中出现的次数,一般会做归一化,即除以文件的总词数(注意是分词数,不是字数). TF=词在文章出现次数 / 文章的总词数 2.逆向文件频率IDF:普遍重 ...

  8. 北京内推 | 中国电信总部大数据AI中心招聘计算机视觉算法实习生

    合适的工作难找?最新的招聘信息也不知道? AI 求职为大家精选人工智能领域最新鲜的招聘信息,助你先人一步投递,快人一步入职! 中国电信 中国电信总部云网运营部大数据AI中心(中国电信集团有限公司数字智 ...

  9. 腾讯QQ大数据:神盾推荐——MAB算法应用总结

    导语:在推荐领域,用户或物品的冷启动,以及如何使推荐结果更加多样的问题在很多实际应用场景中都会遇到.本文主要讲述了神盾推荐在腾讯内部业务场景中,使用MAB方法来解决这两个问题的经验总结,同时本文也较为 ...

最新文章

  1. Python学习笔记十一:面向对象
  2. 图神经网络世界冠军团队手把手授课,7天搞定图神经网络!
  3. 打印图形(1)(C+Java)
  4. js移除某个class_用JS添加和删除class类名
  5. java Integer 源码学习
  6. 博客开通了,开卷有益,纪念一下
  7. Python中利用for循环的求和运算
  8. memsql 多节点部署
  9. Vue打包项目图片等静态资源的处理
  10. 【2011-2012 ACM-ICPC Pacific Northwest Regional Contest】Collateral Cleanup【建图拓扑排序】
  11. 视频教程-R语言绘图基础-其他
  12. java和vue的狱警管理系统监狱系统狱务管理系统
  13. WE出海增长图书馆 | 世界杯豪门面纱下,不容忽视的【增长】沃土
  14. 【Git】查看改动文件清单
  15. java应届毕业生面试技巧
  16. Android攻城狮Dialog
  17. 启动Vue项目发生的错误总结
  18. 关于C++ 里struct 和 class的区别
  19. 斐波那契数列(C++)
  20. 咖啡兔流程执行逻辑分析

热门文章

  1. php 仿 js encodeURI
  2. 关于Intel核心显卡与NVIDIA独立显卡不能正常切换
  3. Github 上的源代码同步到自己的Gitlab 脚本
  4. kubesphere_KubeSphere
  5. 【python应用】 文件名称批量重命名工具
  6. php 生成 pdf dompdf 库使用
  7. 寄存器版本\ALIENTEK MiniSTM32 实验0 新建工程实验
  8. 黑马程序员_Java基础_this,super,static,final关键字
  9. 蓝牙室内定位之AOA室内定位技术详解--新导智能
  10. [总结]PPT高手的思路