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的边
to 属性为 advisor
--------------------------
找到图中的最大出度,入度,度数
最大的出度:(,)
最大的入度:(,)
最大的度数:(,)
------------------------
给图中每个顶点的职业属性上加上“spark字符串
is (xiaozhou,professorSpark) : : (,(xiaozhou,professorSpark))
is (xiaocui,professorSpark) : : (,(xiaocui,professorSpark))
is (soyo,studentSpark) : : (,(soyo,studentSpark))
is (soyo2,postdocSpark) : : (,(soyo2,postdocSpark))
------------------------
给途中每个元组的Edge的属性值设置为源顶点属性值+边的属性值+目标定点属性值:
Edge(,,student+collab+postdoc)
Edge(,,professor+advisor+student)
Edge(,,professor+colleague+professor)
Edge(,,professor+parent+postdoc)
Edge(,,)
Edge(,,)
Edge(,,)
Edge(,,)
------结构操作---------
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的节点,构建子图----------
(,(xiaozhou,professor))
(,(xiaocui,professor))
(,(soyo,student))
xiaozhou is the advisor of soyo
xiaocui is the colleague of xiaozhou
----------构建职业是professor的子图,并打印子图的顶点--------
xiaozhou is professor
xiaocui is professor
Spark GraphX 属性图操作的更多相关文章
- Spark GraphX宝刀出鞘,图文并茂研习图计算秘笈与熟练的掌握Scala语言【大数据Spark实战高手之路】
Spark GraphX宝刀出鞘,图文并茂研习图计算秘笈 大数据的概念与应用,正随着智能手机.平板电脑的快速流行而日渐普及,大数据中图的并行化处理一直是一个非常热门的话题.图计算正在被广泛地应用于社交 ...
- Spark GraphX企业运用
========== Spark GraphX 概述 ==========1.Spark GraphX是什么? (1)Spark GraphX 是 Spark 的一个模块,主要用于进行以图为核心的计 ...
- Spark GraphX学习资料
<Spark GraphX 大规模图计算和图挖掘> http://book.51cto.com/art/201408/450049.htm http://www.csdn.net/arti ...
- 明风:分布式图计算的平台Spark GraphX 在淘宝的实践
快刀初试:Spark GraphX在淘宝的实践 作者:明风 (本文由团队中梧苇和我一起撰写,并由团队中的林岳,岩岫,世仪等多人Review,发表于程序员的8月刊,由于篇幅原因,略作删减,本文为完整版) ...
- Spark GraphX 聚合操作
package Spark_GraphX import org.apache.spark.{SparkConf, SparkContext} import org.apache.spark.graph ...
- Spark GraphX图计算核心源码分析【图构建器、顶点、边】
一.图构建器 GraphX提供了几种从RDD或磁盘上的顶点和边的集合构建图形的方法.默认情况下,没有图构建器会重新划分图的边:相反,边保留在默认分区中.Graph.groupEdges要求对图进行重新 ...
- Spark GraphX图处理编程实例
所构建的图如下: Scala程序代码如下: import org.apache.spark._ import org.apache.spark.graphx._ // To make some of ...
- Spark GraphX图计算核心算子实战【AggreagteMessage】
一.简介 参考博客:https://www.cnblogs.com/yszd/p/10186556.html 二.代码实现 package graphx import org.apache.log4j ...
- Spark GraphX图计算简单案例【代码实现,源码分析】
一.简介 参考:https://www.cnblogs.com/yszd/p/10186556.html 二.代码实现 package big.data.analyse.graphx import o ...
随机推荐
- 集训第四周(高效算法设计)I题 (贪心)
Description Shaass has n books. He wants to make a bookshelf for all his books. He wants the bookshe ...
- mat 服务器分析大堆,本地打开
1:服务器执行nohup sh /usr/local/mat/ParseHeapDump.sh es9.bin org.eclipse.mat.api:suspects org.eclipse.mat ...
- codeforces 330b
#include<stdio.h> #include<string.h> #include<stdlib.h> #define N 1100 int map[N]; ...
- 执行循环任务new Timer().schedule(new TimerTask(){},0,1000);
package com.pingyijinren.test; import android.support.v7.app.AppCompatActivity; import android.os.Bu ...
- codeforces 691D(数据结构)
D. Swaps in Permutation time limit per test 5 seconds memory limit per test 256 megabytes input stan ...
- Layui图标
layui 图标 layui 的所有图标全部采用字体形式,取材于阿里巴巴矢量图标库(iconfont).因此你可以把一个 icon 看作是一个普通的文字,这意味着你直接用 css 控制文字属性,如 c ...
- codevs——1080 线段树练习
1080 线段树练习 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题解 题目描述 Description 一行N个方格,开始每个格子里都有 ...
- 二级域名相同的情况下子页面调用父页面的js方法
这两天项目遇到这种需求.项目是一个平台级系统,其中嵌入了多款应用.在平台上可以使用这些应用操作业务. 现在产品提出了个需求:即在A应用中需要调用js方法来打开B应用. 处理方法是:平台js中给出个打开 ...
- JS中 为什么很多要用两个!! 来判断
比如 if(!!last) 这个就表示 if(last || false).将判断的类型,强转成boolean类型.如果last是null(或者undefine)的话,!last,返回的就是true ...
- Redis集群方案之主从复制(待实践)
Redis有主从复制的功能,一台主可以有多台从,从还可以有多台从,但是从只能有一个主.并且在从写入的数据不会复制到主. 配置 在Redis中,要实现主从复制架构非常简单,只需要在从数据库的配置文件中加 ...