Hadoop+Spark大数据技术 实验11 Spark 图

news2024/12/26 22:29:59

17周期末考试 

重点从第五章 scala语言开始

比如:映射(匿名函数)

dcc2854a71cd438386e9792fcb07ecfb.png

11.3.1创建属性图

import org.apache.spark.graphx._
import org.apache.spark.rdd.RDD
//创建一个顶点集的RDD
val users: RDD[(VertexId ,(String,String))] = sc.parallelize(
    Array(
        (3L,("rxin","student")),
        (7L,("jgonzal","postdoc")),
        (5L,("franklin","prof")),
        (2L,("istoica","prof")),
        
    ))

//创建一个边集的RDD
val relationships:RDD[Edge[String]] = sc.parallelize(Array(
    Edge(3L,7L,"collab"),
    Edge(5L,3L,"advisor"),
    Edge(2L,5L,"colleague"),
    Edge(5L,7L,"pi"),
))

//定义边中用户缺失时的默认(缺失)用户,
val defaultuser = ("John Doe" , "Missing")

//使用users和relationships两个RDD实例化Graph类建立一个Graph对象
val graph = Graph(users, relationships , defaultuser)

//查看图的顶点信息
graph.vertices.collect.foreach(println)

graph.edges.collect.foreach(println)

c24c855420cd43e0af4499e5a83f122d.png

11.3.2使用边集合的RDD创建属性图

//读取本地文件创建属性图
val recordRDD: RDD[String] = sc.textFile("edges .txt")

val EdgeRDD = recordRDD.map{
    x =>val fields = x.split(" ");
    Edge(
        fields(0).toLong, 
        fields(1).toLong, 
        fields(2)
    )
}

//使用EdgeRDD实例化Graph类建立一个Graph对象
val graphInfo = Graph.fromEdges(EdgeRDD,"VerDefaultAttr")

//查看属性图的顶点信息
graphInfo.vertices.collect.foreach(println)

//查看属性图的边信息
graphInfo.edges.collect.foreach(println)

b681716f0bf545d9977d1e1c6fae7186.png

 11.3.3使用边的两个顶点的ID所组成的二元组RDD创建属性图
 

val recordRDD: RDD[String] = sc.textFile("edges.txt")

//创建源点ID和目的点ID二元组集合的RDD
val EdgeTupleRDD = recordRDD.map{
    x=> val fields = x.split("");
    (fields(0).toLong,fields(1).toLong)
}

//使用EdgeTupleRDD实例化Graph类建立一个Graph对象
val graph_fromEdgeTuples = Graph.fromEdgeTuples(EdgeTupleRDD,168L)

graph_fromEdgeTuples.vertices.collect.foreach(println)

graph_fromEdgeTuples.edges.collect.foreach(println)

 5451042714cc4f919d3a7ed05a615a27.png

11.4属性图操作

import org.apache.spark.graphx._
import org.apache.spark.rdd.RDD

//创建一个顶点集的RDD,VertexId是Long 类型数据,顶点属性是二元组
val users:RDD[(VertexId,(String, Int))]=sc.parallelize(Array(
    (1L,("非菲",22)),
    (2L,("乔乔",17)),
    (3L,("王强",19)),
    (4L,("王刚",21)),
    (5L,("李倩",20)),
    (6L,("林锋",25))
))

//创建一个边集的RDD
val relationships: RDD[Edge[Int]] = sc.parallelize(Array(
    Edge(1L, 3L, 15),
    Edge(2L, 1L, 10),
    Edge(2L, 3L, 21), 
    Edge(2L, 4L, 22), 
    Edge(3L, 6L, 10), 
    Edge(4L, 5L, 17),
    Edge(5L, 6L, 20)
))

//定义边中用户缺失时的默认(缺失)用户
val defaultUser =("某某",18)

//使用users 和relationships 两个RDD实例化Graph 类,建立一个Graph 对象
val userGraph = Graph(users,relationships,defaultUser)

11.4.1图的属性操作

下面通过图的属性获取属性图的边的数量、居性图的顶点的数量、属性图的所有顶点的入度、属性图的所有顶点的出度,以及属性图的所有项点的入度与出度之和。

1.获取属性图的边的数量
使用属性图对象的numEdges 属性返回属性图的边的数量,返回值类型为Long。

//获取属性图的边的数量
scala> userGraph.numEdges
resl: Long = 7

 2.获取属性图的顶点的数量

使用属性图对象的mumVertices 属性返回属性图的顶点的数量,返回值类型为Long

scala> userGraph.numVertices

res2:Long = 6//获取顶点的数量

3.获取属性图的所有顶点的人度

使用属性图对象的inDegrees 属性返回属性图的所有顶点的人度,返回值类型为

VertexRDD[Int]。

scala> userGraph.inDegrees.collect.foreach(println)//输出所有顶点的人度

4.获取属性图的所有顶点的出度

使用属性图对象的outDegrees 属性返回属性图的所有顶点的出度,返回值类型为

VertexRDD[Int]。

scala> userGraph.outDegrees.collect.foreach(println)//输出所有顶点的出度

5.获取属性图的所有顶点的入度与出度之和

使用属性图对象的degrees属性返回属性图的所有顶点的入度与出度之和,返回值类型

为VertexRDD[Int]。

scala> userGraph.degrees.collect.foreach(x=>print(x+","))//输出所有顶点的入度和出度之和

(4,2),(1,2),(6,2),(3,3),(5,2),(2,3),

11.4.2图的视图操作

1.顶点视图

//输出所有顶点
userGraph.vertices.collect.foreach(println)
(4,(王刚,21)) (1,(非菲,22)) (5,(李倩,20)) (6,(林锋,25)) (2,(乔乔,17)) (3,(王强,19))

 

//case模式匹配

userGraph.vertices.map{

case(id,(name,age)) =>

(age,name)

}.collect.foreach(println)

(21,王刚)
(22,非菲)
(20,李倩)
(25,林锋)
(17,乔乔)
(19,王强)

 

//过滤

userGraph.vertices.filter{

case(id,(name,age)) =>

age<20

}.collect.foreach(println)

(2,(乔乔,17))
(3,(王强,19))

Selection deleted

 

//元组索引查看顶点信息

userGraph.vertices.map{

v => ("姓名:" + v._2._1,

"年龄:" + v._2._2,

"ID:" + v._1)

}.collect.foreach(println)

(姓名:王刚,年龄:21,ID:4)
(姓名:非菲,年龄:22,ID:1)
(姓名:李倩,年龄:20,ID:5)
(姓名:林锋,年龄:25,ID:6)
(姓名:乔乔,年龄:17,ID:2)
(姓名:王强,年龄:19,ID:3)

2.边视图

//查看所有信息
userGraph.edges.collect.foreach(println) 

Edge(1,3,15)
Edge(2,1,10)
Edge(2,3,21)
Edge(2,4,22)
Edge(3,6,10)
Edge(4,5,17)
Edge(5,6,20)

//过滤

userGraph.edges.filter{

case Edge(src,dst,attr) =>

src > dst

}.collect.foreach(println)

Edge(2,1,10)

//索引查看

userGraph.edges.map{

v => ("源点ID:" + v.srcId,

",目的点ID:" + v.dstId,

",边属性:" + v.attr)

}.collect.foreach(println)

(源点ID:1,,目的点ID:3,,边属性:15)
(源点ID:2,,目的点ID:1,,边属性:10)
(源点ID:2,,目的点ID:3,,边属性:21)
(源点ID:2,,目的点ID:4,,边属性:22)
(源点ID:3,,目的点ID:6,,边属性:10)
(源点ID:4,,目的点ID:5,,边属性:17)
(源点ID:5,,目的点ID:6,,边属性:20)

3.边点三元组视图

//直接查看顶点,边信息

userGraph.triplets.collect.foreach(println) 

实训项目:《平凡的世界》中部分人物关系图分析

  1. 开发本地项目

创建Idea项目(方法见实验8)

下载第三方库GraphStream和BreezeViz,解压GraphStream中的core和ui压缩文件中所有的文件,包括其中所有的包

建立stylesheet.css

代码:P251

  1. 使用sbt项目完成(可选

build.sbt的参考内容如下:

name := "P251"

version := "0.1"

scalaVersion := "2.11.12"

libraryDependencies += "org.apache.spark" %% "spark-core" % "2.4.5"

libraryDependencies += "org.apache.spark" %% "spark-graphx" % "2.4.5"

// Graph Visualization

// https://mvnrepository.com/artifact/org.graphstream/gs-core

libraryDependencies += "org.graphstream" % "gs-core" % "1.2"

// https://mvnrepository.com/artifact/org.graphstream/gs-ui

libraryDependencies += "org.graphstream" % "gs-ui" % "1.2"

// https://mvnrepository.com/artifact/org.scalanlp/breeze_2.10

libraryDependencies += "org.scalanlp" % "breeze_2.11" % "0.12"

// https://mvnrepository.com/artifact/org.scalanlp/breeze-viz_2.11

libraryDependencies += "org.scalanlp" % "breeze-viz_2.11" % "0.12"

// https://mvnrepository.com/artifact/org.jfree/jcommon

libraryDependencies += "org.jfree" % "jcommon" % "1.0.24"

// https://mvnrepository.com/artifact/org.jfree/jfreechart

libraryDependencies += "org.jfree" % "jfreechart" % "1.0.19"

7b1db0a8225047fa844caf7116a7e518.png

ps:注意引用库(模块设置) 

df51157f007046b491b415684a98e22e.png

db2f791084bd4f3d91f4331dd39be9c6.png

代码内容:

491a3731f5c54e50835f4f358ee0541f.png

d869b4c243b344519fa58ce84aa1c965.png

 运行结果:

9cc17dc1f2a04876a474e98f2664d64c.png

 

 

 

 

 

 

 

 

 

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1800942.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

vue2组件封装实战系列之alert组件

组件之 GfAlert 消息组件一般用于提示用户&#xff0c;比如通知&#xff0c;警告等消息。 效果预览 属性 参数类型说明可选值默认值titleString显示的标题typeString类型effectString显示的标题descriptionString描述closeTextString显示的标题showIconBoolean显示左侧的图标c…

C++ | Leetcode C++题解之第137题只出现一次的数字II

题目&#xff1a; 题解&#xff1a; class Solution { public:int singleNumber(vector<int>& nums) {int a 0, b 0;for (int num: nums) {b ~a & (b ^ num);a ~b & (a ^ num);}return b;} };

“三夏”农忙:EasyCVR/EasyDSS无人机技术助推现代农业走向智能化

随着科技的飞速发展&#xff0c;无人机技术已经逐渐渗透到我们生活的方方面面。其中&#xff0c;无人机在农业领域的应用尤为引人注目。它们不仅提高了农业生产的效率&#xff0c;还为农民带来了更便捷、更智能的种植方式。 无人机在农业应用场景中&#xff0c;通过搭载各种设备…

Python魔法之旅-魔法方法(22)

目录 一、概述 1、定义 2、作用 二、应用场景 1、构造和析构 2、操作符重载 3、字符串和表示 4、容器管理 5、可调用对象 6、上下文管理 7、属性访问和描述符 8、迭代器和生成器 9、数值类型 10、复制和序列化 11、自定义元类行为 12、自定义类行为 13、类型检…

Python cProfile 输出解析及其解决方案

cProfile 是 Python 中用于性能分析的内置模块&#xff0c;它可以帮助你确定程序中哪些部分消耗了最多的时间。通常&#xff0c;使用 cProfile 会输出大量的数据&#xff0c;需要进行解析和分析。下面是关于 cProfile 输出解析及其解决方案的一些提示&#xff1a; 1、问题背景 …

读AI未来进行式笔记06自动驾驶技术

1. 跃层冲击 1.1. 每个社会其实都处于不同的楼层&#xff0c;往往处于更低楼层的社会&#xff0c;要承受来自更高楼层的社会发展带来的更大冲击 2. 驾驶 2.1. 开车时最关键的不是车&#xff0c;而是路 2.2. 人是比机器更脆弱的生命&am…

多线程leetcode编程题

synchronized 实现 class ReentrantTest {private int n;private volatile int flag 1;private Object lock new Object();public ReentrantTest(int n) {this.n n;}public void zero(IntConsumer printNumber) throws InterruptedException{for(int i1;i<n;){synchron…

.net core 使用js,.net core 使用javascript,在.net core项目中怎么使用javascript

.net core 使用js&#xff0c;.net core 使用javascript&#xff0c;在.net core项目中怎么使用javascript 我项目里需要用到“文字编码”&#xff0c;为了保证前端和后端的编码解码不处bug, 所以&#xff0c;我在项目中用了这个 下面推荐之前在.net F4.0时的方法 文章一&#…

08_旷视轻量化网络--ShuffleNet V1

1.1 简介 ShuffleNetV1是旷视科技&#xff08;Face&#xff09;在2017年提出的一种专为移动设备设计的高效卷积神经网络&#xff08;CNN&#xff09;架构。它的主要目标是在保证模型精度的同时&#xff0c;极大地降低计算成本&#xff0c;使其更适合资源受限的环境&#xff0c…

wx小程序自定义tabbar

1.在app.json文件中&#xff0c;添加自定义tabbar配置&#xff1a;"custom": true "tabBar": {"custom": true,"backgroundColor": "#fafafa","borderStyle": "white","selectedColor": &quo…

高精度加法的实现

这是C算法基础-基础算法专栏的第七篇文章&#xff0c;专栏详情请见此处。 引入 在C语言中&#xff0c;int的可存储数据范围是-2147483648~2147483647&#xff0c;long long的可存储数据范围是-9223372036854775808~9223372036854775807&#xff0c;但是如果一些数据比long long…

2021JSP普及组第二题:插入排序

2021JSP普及组第二题 题目&#xff1a; 思路&#xff1a; 题目要求排序后根据操作进行对应操作。 操作一需要显示某位置数据排序后的位置&#xff0c;所以需要定义结构体数组储存原数据的位置和数据本身排序后所得数据要根据原位置输出排序后的位置&#xff0c;所以建立一个新…

Linux lvm卷扩容之SSM

介绍 SSM&#xff08;System Storage Manager&#xff09;是系统存储管理器&#xff0c;它是一种统一的命令行界面&#xff0c;用于管理各种存储设备。通过SSM&#xff0c;用户可以方便地管理、配置和监控存储系统。检查关于可用硬驱和LVM卷的信息。显示关于现有磁盘存储设备、…

新能源汽车内卷真相

导语&#xff1a;2025年&#xff0c;我国新能源汽车总产能预计可达3661万辆&#xff0c;如此产能如何消化&#xff1f; 文 | 胡安 “这样卷下去不是办法&#xff0c;企业目的是什么&#xff1f;是盈利&#xff0c;为国家作贡献&#xff0c;为社会作贡献。我们应该有大格局&…

Stable-Diffusion的WebUI部署

1、环境准备及安装 1.1、linux环境 # 首先&#xff0c;已经预先安装好了anaconda&#xff0c;在这里新建一个环境 conda create -n sdwebui python3.10 # 安装完毕后&#xff0c;激活该环境 conda activate sdwebui# 安装 # 下载stable-diffusion-webui代码 git clone https:…

2024年安全现状报告

2024 年安全现状报告有些矛盾。尽管安全专业人员的道路困难重重&#xff0c;比如说严格的合规要求、不断升级的地缘政治紧张局势和更复杂的威胁环境&#xff0c;但整个行业还是在取得进展。 许多组织表示&#xff0c;与前几年相比&#xff0c;网络安全变得更容易管理。组织之间…

经典文献阅读之--MGS-SLAM(单目稀疏跟踪和高斯映射与深度平滑正则化)

Tip: 如果你在进行深度学习、自动驾驶、模型推理、微调或AI绘画出图等任务&#xff0c;并且需要GPU资源&#xff0c;可以考虑使用UCloud云计算旗下的Compshare的GPU算力云平台。他们提供高性价比的4090 GPU&#xff0c;按时收费每卡2.6元&#xff0c;月卡只需要1.7元每小时&…

线性代数|机器学习-P9向量和矩阵范数

文章目录 1. 向量范数2. 对称矩阵S的v范数3. 最小二乘法4. 矩阵范数 1. 向量范数 范数存在的意义是为了实现比较距离&#xff0c;比如&#xff0c;在一维实数集合中&#xff0c;我们随便取两个点4和9&#xff0c;我们知道9比4大&#xff0c;但是到了二维实数空间中&#xff0c…

认识Spring 中的BeanPostProcessor

关于BeanPostProcessor和BeanFactoryPostProcessors&#xff0c;将分2篇文章来写&#xff0c;这篇文章是对Spring 中BeanPostProcessor进行了总结 先看下大模型对这个类的介绍&#xff0c;随后再看下这两个类的示例&#xff0c;最后看下这两个类的实现。 这两个类从名字看都很类…

堆盘子00

题目链接 堆盘子 题目描述 注意点 SetOfStacks应该由多个栈组成&#xff0c;并且在前一个栈填满时新建一个栈 解答思路 将多个栈存储到一个List中&#xff0c;当入栈时&#xff0c;如果List中最后一个栈容量已经达到cap&#xff0c;则需要新建一个栈&#xff0c;将元素推到…