Spark GraphX 属性图操作

package Spark_GraphX

import org.apache.spark.graphx._
import org.apache.spark.rdd.RDD
import org.apache.spark.{SparkConf, SparkContext}

object 属性图 {
  def main(args: Array[String]): Unit = {
    val conf=new SparkConf().setAppName("SimpleGraphX").setMaster("local[4]")
    val sc=new SparkContext(conf)
   //定义顶点
    val users:RDD[(VertexId,(String,String))]=sc.parallelize(Array((3L,("soyo","student")),(7L,("soyo2","postdoc")),(5L,("xiaozhou","professor")),(2L,("xiaocui","professor"))))
    //定义边
    val relationships:RDD[Edge[String]]=sc.parallelize(Array(Edge(3L,7L,"collab"),Edge(5L,3L,"advisor"),Edge(2L,5L,"colleague"),Edge(5L,7L,"parent")))
   //定义默认的作者,以防与不存在的作者有边
    val defaultUser=("Jone","Dance")
    val graph=Graph(users,relationships,defaultUser)
    println("*****************")
    println("找到图中属性是student的点")
    graph.vertices.filter{case (id,(name,occupation))=>occupation=="student"}.collect.foreach{case(id,(name,occupation))=>println(s"$name is $occupation")}
    println("--------------------------")
    println("找到途中边的属性是advisor的边")
    graph.edges.filter(x=>x.attr=="advisor").collect().foreach(x=>println(s"${x.srcId} to ${x.dstId} 属性为 ${x.attr}"))
    println("--------------------------")
    println("找到图中的最大出度,入度,度数")
    println("最大的出度:"+graph.outDegrees.reduce(max))
    println("最大的入度:"+graph.inDegrees.reduce(max))
    println("最大的度数:"+graph.degrees.reduce(max))
    //Scala 可直接调用Java程序
    // System.out.print("hello word")
    //属性操作
    println("------------------------")
    println("给图中每个顶点的职业属性上加上“spark字符串")
    graph.mapVertices{case (id,(name,occupation))=>(id,(name,occupation+"Spark"))}.vertices.collect.foreach(x=>println(s"${x._2._1} is ${x._2._2} : ${x._1} : ${x._2}"))
    println("------------------------")
    println("给途中每个元组的Edge的属性值设置为源顶点属性值+边的属性值+目标定点属性值:")
   graph.mapTriplets(x=>x.srcAttr._2+"+"+x.attr+"+"+x.dstAttr._2).edges.collect().foreach(println)
    //可以证明:属性操作下,图的结构都不受影响.
    graph.mapTriplets(x=>x.srcId+x.dstId).edges.collect().foreach(println)
   //结构操作 :triplets(表示边)
    /*
     reverse操作返回一个所有边方向取反的新图.该反转操作并没有修改图中顶点,边的属性,更没有增加边的数量.
     subgraph操作主要利用顶点和边进行判断,返回的新图中包含满足判断要求的顶点,边.该操作常用于一些情景,比如:限制感兴趣的图顶点和边,删除损坏连接.
     */
    println("------结构操作---------")
    graph.triplets.map(x=>x.srcAttr._1+" is the "+x.attr+" of "+x.dstAttr._1).foreach(println)
    println("-------删除职业是postdoc的节点,构建子图----------")
    val validGraph=graph.subgraph(vpred=(id,attr)=>attr._2!="postdoc")
    validGraph.vertices.foreach(println)
    validGraph.triplets.map(x=>x.srcAttr._1+" is the "+x.attr+" of "+x.dstAttr._1).foreach(println)
    println("----------构建职业是professor的子图,并打印子图的顶点--------")
    val subGraph=graph.subgraph(vpred = (id,attr)=>attr._2=="professor")
    subGraph.vertices.collect().foreach(x=>println(s"${x._2._1} is ${x._2._2}"))

  }
  //VertexId:顶点,Int:度数
  def max(a:(VertexId,Int),b:(VertexId,Int)):(VertexId,Int)={
    if(a._2>b._2)a else b
  }

}

结果:

*****************
找到图中属性是student的点
soyo is student
--------------------------
找到途中边的属性是advisor的边
5 to 3 属性为 advisor
--------------------------
找到图中的最大出度,入度,度数
最大的出度:(5,2)
最大的入度:(7,2)
最大的度数:(5,3)
------------------------
给图中每个顶点的职业属性上加上“spark字符串
5 is (xiaozhou,professorSpark) : 5 : (5,(xiaozhou,professorSpark))
2 is (xiaocui,professorSpark) : 2 : (2,(xiaocui,professorSpark))
3 is (soyo,studentSpark) : 3 : (3,(soyo,studentSpark))
7 is (soyo2,postdocSpark) : 7 : (7,(soyo2,postdocSpark))
------------------------
给途中每个元组的Edge的属性值设置为源顶点属性值+边的属性值+目标定点属性值:
Edge(3,7,student+collab+postdoc)
Edge(5,3,professor+advisor+student)
Edge(2,5,professor+colleague+professor)
Edge(5,7,professor+parent+postdoc)
Edge(3,7,10)
Edge(5,3,8)
Edge(2,5,7)
Edge(5,7,12)
------结构操作---------
xiaozhou is the parent of soyo2
soyo is the collab of soyo2
xiaozhou is the advisor of soyo
xiaocui is the colleague of xiaozhou
-------删除职业是postdoc的节点,构建子图----------
(5,(xiaozhou,professor))
(2,(xiaocui,professor))
(3,(soyo,student))
xiaozhou is the advisor of soyo
xiaocui is the colleague of xiaozhou
----------构建职业是professor的子图,并打印子图的顶点--------
xiaozhou is professor
xiaocui is professor
时间: 2024-12-13 08:21:06

Spark GraphX 属性图操作的相关文章

Spark GraphX宝刀出鞘,图文并茂研习图计算秘笈与熟练的掌握Scala语言【大数据Spark

Spark GraphX宝刀出鞘,图文并茂研习图计算秘笈 大数据的概念与应用,正随着智能手机.平板电脑的快速流行而日渐普及,大数据中图的并行化处理一直是一个非常热门的话题.图计算正在被广泛地应用于社交网络.电子商务,地图等领域.对于图计算的两个核心问题:图存储模式和图计算模型,Spark GraphX给出了近乎完美的答案, 而Spark GraphX作为图计算领域的屠龙宝刀,对Pregel  API的支持更是让Spark GraphX如虎添翼.Spark GraphX可以轻而易举的完成基于度分布

明风:分布式图计算的平台Spark GraphX 在淘宝的实践

快刀初试:Spark GraphX在淘宝的实践 作者:明风 (本文由团队中梧苇和我一起撰写,并由团队中的林岳,岩岫,世仪等多人Review,发表于程序员的8月刊,由于篇幅原因,略作删减,本文为完整版) 对于网络科学而言,世间万物都可以抽象成点,而事物之间的关系都可以抽象成边,并根据不同的应用场景,生成不同的网络,因此整个世界都可以用一个巨大的复杂网络来代表.有关复杂网络和图算法的研究,在最近的十几年取得了巨大的进展,并在多个领域有重要的应用. 作为最大的电商平台,淘宝上数亿买家和卖家,每天产生数

Spark Graphx图计算案例实战之aggregateMessages求社交网络中的最大年纪追求者和平均年纪!

Spark Graphx提供了mapReduceTriplets来对图进行聚合计算,但是1.2以后不再推荐使用,源代码如下: @deprecated("use aggregateMessages", "1.2.0") def mapReduceTriplets[A: ClassTag](     mapFunc: EdgeTriplet[VD, ED] => Iterator[(VertexId, A)],     reduceFunc: (A, A) =&g

spark graphx图计算

一.使用graph做好友推荐 import org.apache.spark.graphx.{Edge, Graph, VertexId} import org.apache.spark.rdd.RDD import org.apache.spark.{SparkConf, SparkContext} //求共同好友 object CommendFriend { def main(args: Array[String]): Unit = { //创建入口 val conf: SparkConf

Spark GraphX图计算【代码实现,源码分析】

一.简介 参考:https://www.cnblogs.com/yszd/p/10186556.html 二.代码实现 1 package big.data.analyse.graphx 2 3 import org.apache.log4j.{Level, Logger} 4 import org.apache.spark.graphx._ 5 import org.apache.spark.rdd.RDD 6 import org.apache.spark.sql.SparkSession

Spark GraphX图计算核心算子实战【AggreagteMessage】

一.简介 参考博客:https://www.cnblogs.com/yszd/p/10186556.html 二.代码实现 1 package graphx 2 3 import org.apache.log4j.{Level, Logger} 4 import org.apache.spark.graphx.util.GraphGenerators 5 import org.apache.spark.sql.SparkSession 6 7 /** 8 * Created by Adminis

GraphX 的属性图

package main.scala import org.apache.spark.graphx.{Edge, Graph, VertexId} import org.apache.spark.rdd.RDD import org.apache.spark.{SparkConf, SparkContext} object graph_test { // define hadoop_home directory System.setProperty("hadoop.home.dir",

Spark GraphX实例(1)

Spark GraphX是一个分布式的图处理框架.社交网络中,用户与用户之间会存在错综复杂的联系,如微信.QQ.微博的用户之间的好友.关注等关系,构成了一张巨大的图,单机无法处理,只能使用分布式图处理框架处理,Spark GraphX就是一种分布式图处理框架. 1. POM文件 在项目的pom文件中加上Spark GraphX的包: <dependency> <groupId>org.apache.spark</groupId> <artifactId>sp

基于Spark GraphX计算二度关系

关系计算问题描述 二度关系是指用户与用户通过关注者为桥梁发现到的关注者之间的关系.目前微博通过二度关系实现了潜在用户的推荐.用户的一度关系包含了关注.好友两种类型,二度关系则得到关注的关注.关注的好友.好友的关注.好友的好友四种类型. 如果要为全站亿级用户根据二度关系和四种桥梁类型推荐桥梁权重最高 TopN 个用户,大致估算了下总关系量在千亿级别,按照原有的 Mapreduce 模式计算整个二度关系,需要以桥梁用户为 Key,把它的关注和粉丝两个亿级的表做 Join,如果活跃用户按照亿计,平均关