5. 图的转换操作

图的转换操作主要有以下的方法:

(1) Graph.mapVertices():对图的顶点进行转换,返回一张新图;

(2) Graph.mapEdges():对图的边进行转换,返回一张新图。

代码:

    // 转换操作
println("*************************************************************")
println("转换操作")
println("*************************************************************")
println("顶点的转换操作,顶点age+10:")
graph.mapVertices{case(id,(name,age)) => (id,(name,age+10))}.vertices.collect.foreach(v => println(s"${v._2._1} is${v._2._2}")) println("边的转换操作,边的属性*2:")
graph.mapEdges(e => e.attr*2).edges.collect.foreach(e => println(s"${e.srcId} to ${e.dstId} att ${e.attr}"))

运行结果:

*************************************************************
转换操作
*************************************************************
顶点的转换操作,顶点age+1:
4 is(Peter,33)
6 is(Kate,24)
2 is(Henry,28)
1 is(Alice,39)
3 is(Charlie,56)
5 is(Mike,36)
边的转换操作,边的属性*3:
2 to 1 att 15
2 to 4 att 6
3 to 2 att 21
3 to 6 att 9
4 to 1 att 3
5 to 2 att 9
5 to 3 att 24
5 to 6 att 24

6. 图的结构操作

图的结构操作主要有:

(1) Graph.subgraph():求图的子图,从图中选出一些顶点,这些顶点以及相应的边就构成了一张子图。

代码:

    println("*************************************************************")
println("结构操作")
println("*************************************************************")
println("顶点年纪>25的子图:")
val subGraph = graph.subgraph(vpred = (id,vd) => vd._2 >= 25)
println("子图所有顶点:")
subGraph.vertices.collect.foreach(v => println(s"${v._2._1} is ${v._2._2}"))
println
println("子图所有边:")
subGraph.edges.collect.foreach(e => println(s"${e.srcId} to ${e.dstId} att ${e.attr}"))

从图中选出年龄大于等于25岁的顶点。运行结果:

*************************************************************
结构操作
*************************************************************
顶点年纪>25的子图:
子图所有顶点:
Peter is 32
Henry is 27
Alice is 38
Charlie is 55
Mike is 35 子图所有边:
2 to 1 att 5
2 to 4 att 2
3 to 2 att 7
4 to 1 att 1
5 to 2 att 3
5 to 3 att 8

7. 图的连接操作

图的连接操作主要有以下方法:

(1) Graph.joinVertices(Graph):对于两个图中都存在的顶点进行转换;

(2) Graph.outerJoinVertices(Graph):和(1)类似,区别在于一个顶点只在前一个图中有,后一个图里面没有,就将这个顶点的属性设为Null。

代码:

    // 连接操作
println("*************************************************************")
println("连接操作")
println("*************************************************************")
case class User(name:String, age:Int, inDeg:Int, outDeg:Int) // 创建一个新图,顶点VD的数据类型为User,并从graph做类型转换
val initialUserGraph:Graph[User, Int] = graph.mapVertices{case(id,(name,age)) => User(name,age,0,0)} // initialUserGraph与inDegrees,outDegrees(RDD)进行连接,并修改initialUserGraph中inDeg值,outDeg值
val userGraph = initialUserGraph.outerJoinVertices(initialUserGraph.inDegrees){
case(id, u, inDegOpt) => User(u.name, u.age, inDegOpt.getOrElse(0), u.outDeg)}.outerJoinVertices(initialUserGraph.outDegrees){
case(id, u, outDegOpt) => User(u.name, u.age, u.inDeg, outDegOpt.getOrElse(0))
}
println("连接图的属性:")
userGraph.vertices.collect.foreach(v => println(s"${v._2.name} inDeg:${v._2.inDeg} outDeg:${v._2.outDeg}")) println("出度和入度相同的人员:")
userGraph.vertices.filter{
case(id, v) => v.inDeg==v.outDeg
}.collect.foreach{
case(id, property) => println(property.name)
}
println

其实是一个图分别和自己的入度图、出度图进行连接操作,以便把顶点的出度和入度写入顶点的属性。

运行结果:

*************************************************************
连接操作
*************************************************************
连接图的属性:
Peter inDeg:1 outDeg:1
Kate inDeg:2 outDeg:0
Henry inDeg:2 outDeg:2
Alice inDeg:2 outDeg:0
Charlie inDeg:1 outDeg:2
Mike inDeg:0 outDeg:3
出度和入度相同的人员:
Peter
Henry

Spark GraphX实例(2)的更多相关文章

  1. Spark GraphX实例(1)

    Spark GraphX是一个分布式的图处理框架.社交网络中,用户与用户之间会存在错综复杂的联系,如微信.QQ.微博的用户之间的好友.关注等关系,构成了一张巨大的图,单机无法处理,只能使用分布式图处理 ...

  2. Spark GraphX实例(3)

    7. 图的聚合操作 图的聚合操作主要的方法有: (1) Graph.mapReduceTriplets():该方法有一个mapFunc和一个reduceFunc,mapFunc对图中的每一个EdgeT ...

  3. 大数据技术之_19_Spark学习_05_Spark GraphX 应用解析 + Spark GraphX 概述、解析 + 计算模式 + Pregel API + 图算法参考代码 + PageRank 实例

    第1章 Spark GraphX 概述1.1 什么是 Spark GraphX1.2 弹性分布式属性图1.3 运行图计算程序第2章 Spark GraphX 解析2.1 存储模式2.1.1 图存储模式 ...

  4. Spark GraphX图处理编程实例

    所构建的图如下: Scala程序代码如下: import org.apache.spark._ import org.apache.spark.graphx._ // To make some of ...

  5. 1. Spark GraphX概述

    1.1 什么是Spark GraphX Spark GraphX是一个分布式图处理框架,它是基于Spark平台提供对图计算和图挖掘简洁易用的而丰富的接口,极大的方便了对分布式图处理的需求.那么什么是图 ...

  6. 转载:Spark GraphX详解

    1.GraphX介绍 1.1 GraphX应用背景 Spark GraphX是一个分布式图处理框架,它是基于Spark平台提供对图计算和图挖掘简洁易用的而丰富的接口,极大的方便了对分布式图处理的需求. ...

  7. Spark GraphX从入门到实战

      第1章 Spark GraphX 概述 1.1 什么是 Spark GraphX   Spark GraphX 是一个分布式图处理框架,它是基于 Spark 平台提供对图计算和图挖掘简洁易用的而丰 ...

  8. Spark + GraphX + Pregel

    Spark+GraphX图 Q:什么是图?图的应用场景 A:图是由顶点集合(vertex)及顶点间的关系集合(边edge)组成的一种网状数据结构,表示为二元组:Gragh=(V,E),V\E分别是顶点 ...

  9. Spark—GraphX编程指南

    Spark系列面试题 Spark面试题(一) Spark面试题(二) Spark面试题(三) Spark面试题(四) Spark面试题(五)--数据倾斜调优 Spark面试题(六)--Spark资源调 ...

随机推荐

  1. 步步为营-36-ADO.Net简介

    与数据库进行连接交互 方法一 #region 01连接对象 //01 连接字符串 string connstr = "server=.;uid=sa;pwd=sa;database=Demo ...

  2. hdu 2680 多起点一终点

    注意这是一个有向图! 多起点,一终点 反过来,看成一个起点,多个终点,找最短路 因为是有向图 所以u->v 要也要反过来成为v->u Sample Input5 8 5 //结点数 边数 ...

  3. Anchor 的两种编程实现

    aspect ratios:高宽比率 假设 window 的尺寸为:\((w, h)\),锚框的尺寸为:\((w_1, h_1)\),则有: \[ \begin{cases} \frac{w_1h_1 ...

  4. MySQL数据库crash的问题分析

    [问题] 生产环境有多台slave服务器,不定期的会crash,下面是error log中的堆栈信息 Thread pointer: 0x7f1e54b26410 Attempting backtra ...

  5. Web前端性能优化——编写高效的JavaScript

    前言 随着计算机的发展,Web富应用时代的到来,Web 2.0早已不再是用div+css高质量还原设计的时代.自Gmail网页版邮件服务的问世开始,Web前端开发也开启了新的纪元.用户需求不断提高,各 ...

  6. Luogu2586 [ZJOI2008]杀蚂蚁 ---- 模拟

    Luogu2586 [ZJOI2008]杀蚂蚁 题意 还是一道大模拟 https://www.luogu.org/problemnew/show/P2586 大概就是炮塔大蚂蚁的故事 下载这个游戏ht ...

  7. 安卓工作室 android studio文件和代码模板,以及汉化出错问题

    安卓工作室 android studio文件和代码模板,以及汉化出错问题 作者:韩梦飞沙 Author:han_meng_fei_sha 邮箱:313134555@qq.com E-mail: 313 ...

  8. BZOJ.4298.[ONTAK2015]Bajtocja(Hash 启发式合并)

    题目链接 \(Description\) 给定\(d\)张无向图,每张图都有\(n\)个点.一开始,在任何一张图中都没有任何边. 接下来有\(m\)次操作,每次操作会给出\(a,b,k\),意为在第\ ...

  9. PHP Math 函数 mt_rand() 使用 Mersenne Twister 算法返回随机整数。

    语法 mt_rand(min,max) 说明 如果没有提供可选参数 min 和 max,mt_rand() 返回 0 到 RAND_MAX 之间的伪随机数.例如想要 5 到 15(包括 5 和 15) ...

  10. LCD带字符液晶显示I LOVE YOU

    1602是字符型液晶,内含128个ASCLL字符型的字符库,故可以显示ASCLL字符,而不能显示汉字. 1602可以显示两行信息,每行16个字符,5V电源供电,带有背光. 知识点: #include ...