news 2026/3/6 7:37:39

Spark实战:在GraphX中创建和计算图

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Spark实战:在GraphX中创建和计算图

文章目录

  • 1. 实战概述
  • 2. 实战步骤
    • 2.1 用户关系网络图
    • 2.2 准备数据文件
      • 2.2.1 创建本地文件
      • 2.2.2 创建HDFS目录
      • 2.2.3 上传数据文件到HDFS
    • 2.3 创建与存储图
      • 2.3.1 创建图
        • 2.3.1.1 导入GraphX包
        • 2.3.1.2 根据有属性的顶点和边构建图(`Graph()`)
        • 2.3.1.3 根据边创建图(`Graph.fromEdges()`)
        • 2.3.1.4 根据边的两个顶点的二元组创建图(`Graph.fromEdgeTuples()`)
      • 2.3.2 缓存与释放图
    • 2.4 查询与转换数据
      • 2.4.1 数据查询
      • 2.4.2 数据转换
    • 2.5 转换结构与关联聚合数据
      • 2.5.1 结构转换
      • 2.5.2 数据关联聚合
  • 3. 实战总结

1. 实战概述

  • 本次实战围绕 Spark GraphX 构建学术用户关系网络图展开,通过准备顶点与边数据、上传至 HDFS,并使用Graph()Graph.fromEdges()Graph.fromEdgeTuples()三种方式创建图对象,验证了图的正确加载与结构完整性,为后续图计算奠定基础。

2. 实战步骤

2.1 用户关系网络图

  • 绘制用户关系网络图
  • 该图展示了一个学术用户关系网络:节点代表用户(如学生、教授、博士后),边表示关系(如导师、同事、合作者)。例如,mike 是 brown 的学生,green 与 mike 合作,brown 与 alice 为同事,green 也是 brown 的 PI。体现了学术协作与层级结构。

2.2 准备数据文件

2.2.1 创建本地文件

  1. 创建用户关系网络图顶点数据文件

    • 执行命令:vim vertices.txt
  2. 创建用户关系网络图边数据文件

    • 执行命令:vim edges.txt

2.2.2 创建HDFS目录

  • 执行命令:hdfs dfs -mkdir -p /graphx/data

2.2.3 上传数据文件到HDFS

  • 执行命令:hdfs dfs -put vertices.txt /graphx/data
  • 执行命令:hdfs dfs -put edges.txt /graphx/data

2.3 创建与存储图

2.3.1 创建图

2.3.1.1 导入GraphX包
  • 执行命令
    scala import org.apache.spark._ import org.apache.spark.graphx._ import org.apache.spark.rdd.RDD

  • 结果说明:该图展示了在 Spark Shell 中成功导入核心包的过程。三条import语句分别引入了 Spark 核心、GraphX 图计算和 RDD 操作相关类,为后续分布式数据处理和图算法开发做好准备,表明环境配置正确,可进行 Spark 编程。

2.3.1.2 根据有属性的顶点和边构建图(Graph()
  • 构造有属性的顶点和边的图

    // 创建顶点 RDDvalusers:RDD[(VertexId,(String,String))]=sc.textFile("hdfs://master:9000/graphx/data/vertices.txt").map{line=>valfields=line.split(" ")(fields(0).toLong,(fields(1),fields(2)))}// 创建边 RDDvalrelationships:RDD[Edge[String]]=sc.textFile("hdfs://master:9000/graphx/data/edges.txt").map{line=>valfields=line.split(" ")Edge(fields(0).toLong,fields(1).toLong,fields(2))}// 定义默认用户(用于处理缺失顶点)valdefaultUser=("Black Smith","Missing")// 构建图对象valgraph_urelate=Graph(users,relationships,defaultUser)

  • 结果说明:代码成功在 Spark Shell 中执行,从 HDFS 加载顶点和边数据,构建了 GraphX 图对象。输出显示 users 和 relationships RDD 已创建,defaultUser 定义完成,最终生成 graph_urelate 图实例,表明图结构构建成功,可进行后续图计算操作。

  • 查询图的顶点,执行命令:graph_urelate.vertices.collect.foreach(println)

  • 结果说明:执行命令后,输出了图中所有顶点的属性信息,显示了每个用户节点的 ID 和对应的角色(如 alice 是 professor,mike 是 student 等),表明图的顶点数据已成功加载并可访问,验证了 GraphX 图结构构建正确。

  • 查询图的边,执行命令:graph_urelate.edges.collect.foreach(println)

  • 结果说明:执行命令后,输出了图中所有边的信息,显示了节点之间的关系类型,如 3 和 7 是合作者(Collaborator),5 和 3 是导师关系(Advisor)等,表明图的边数据已正确加载,验证了用户关系网络结构构建成功。

2.3.1.3 根据边创建图(Graph.fromEdges()
  • 利用Graph.fromEdges()方法创建图

    // 读取边数据文件valrecords:RDD[String]=sc.textFile("hdfs://master:9000/graphx/data/edges.txt")// 解析每行数据为 Edge 对象valfollowers:RDD[Edge[String]]=records.map{line=>valfields=line.split(" ")Edge(fields(0).toLong,fields(1).toLong,fields(2))}// 基于边构建图(顶点属性统一设为默认值 1L)valgraphFromEdges=Graph.fromEdges(followers,defaultValue=1L)

  • 结果说明:代码成功从 HDFS 读取边数据并解析为 Edge RDD,构建了图对象graph_fromEdges。输出显示 records、followers 和 graph_fromEdges 均已正确创建,表明边数据加载和图结构初始化完成,可进行后续图计算操作。

  • 查询图的顶点,执行命令:graph_fromEdges.vertices.collect.foreach(println)

  • 结果说明:该命令输出了图中所有顶点的 ID 及其属性,显示每个节点的值均为 1(默认值),表明Graph.fromEdges成功从边数据推导出顶点集合,并为每个顶点分配了统一的默认属性,验证了图结构构建正确。

  • 查询图的边,执行命令:graph_fromEdges.edges.collect.foreach(println)

  • 结果说明:该命令输出了图中所有边的信息,显示了节点之间的关系类型,如 3 和 7 是合作者(Collaborator),5 和 3 是导师关系(Advisor)等,表明边数据已正确加载并保留原始属性,验证了图结构构建成功。

2.3.1.4 根据边的两个顶点的二元组创建图(Graph.fromEdgeTuples()
  • 提示:此方式适用于仅需源点和目标点、忽略边属性的场景。若需保留关系类型(如 “Advisor”),应使用 Edge 对象而非二元组。

  • 利用Graph.fromEdgeTuples()方法创建图

    // 读取边数据文件valrecords:RDD[String]=sc.textFile("hdfs://master:9000/graphx/data/edges.txt")// 解析为 (srcId, dstId) 二元组 RDDvaledgesRDD:RDD[(VertexId,VertexId)]=records.map(line=>line.split(" ")).map(fields=>(fields(0).toLong,fields(1).toLong))// 基于边二元组构建图(顶点属性设为默认值 1L)valgraphFromEdgeTuples=Graph.fromEdgeTuples(edgesRDD,defaultValue=1L)

  • 结果说明:代码成功从 HDFS 读取边数据,解析为顶点 ID 的二元组 RDD,并通过Graph.fromEdgeTuples构建图对象。输出显示 records、edgesRDD 和 graphFromEdgeTuples 均已正确创建,表明图结构初始化成功,可进行后续图计算操作。

  • 查询图的顶点,执行命令:graphFromEdgeTuples.vertices.collect.foreach(println)

  • 结果说明:该命令输出了图中所有顶点的 ID 及其默认属性值(1),表明Graph.fromEdgeTuples成功从边数据推导出顶点集合,并为每个顶点分配统一默认属性,验证了图结构构建正确,顶点信息完整。

  • 查询图的边,执行命令:graphFromEdgeTuples.edges.collect.foreach(println)

  • 结果说明:该命令输出了图中所有边的结构,显示每条边的源点、目标点及默认属性值(1),表明Graph.fromEdgeTuples成功构建了边集合,且边数据完整保留,验证了图的边信息正确加载并可访问。

2.3.2 缓存与释放图

2.4 查询与转换数据

2.4.1 数据查询

2.4.2 数据转换

2.5 转换结构与关联聚合数据

2.5.1 结构转换

2.5.2 数据关联聚合

3. 实战总结

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/5 3:10:48

终极指南:打造完美iOS对话框的7个秘诀

终极指南:打造完美iOS对话框的7个秘诀 【免费下载链接】SDCAlertView The little alert that could 项目地址: https://gitcode.com/gh_mirrors/sd/SDCAlertView 在iOS开发中,一个美观且功能强大的对话框解决方案往往能显著提升应用的用户体验。S…

作者头像 李华
网站建设 2026/3/5 3:44:21

策略园丁(元学习):从知识的搬运工,到智慧的耕种者

《元能力系统:重塑你的内在架构》 第二模块:【架构篇】—— 绘制你的内在生态地图 第9/21篇 专栏引言 这不只是一套关于效率的方法论,更是一场系统性的心智觉醒之旅。我们将从“被动反应”的生存模式,跃迁至“主动建构”的生命创造模式。 本文是【架构篇】的收官之作。…

作者头像 李华
网站建设 2026/3/5 2:31:26

公路工程项目用地规范标准详解

公路工程项目用地规范标准详解 【免费下载链接】公路工程项目建设用地指标 探索公路工程项目建设用地的权威指南,本仓库提供《公路工程项目建设用地指标 建标[2011]124号》PDF文件,为公路建设领域的专业人士提供详尽的用地规范与标准。这份文件是您规划和…

作者头像 李华
网站建设 2026/3/5 3:42:25

PWA资产生成器:告别繁琐,拥抱高效的渐进式Web应用开发

PWA资产生成器:告别繁琐,拥抱高效的渐进式Web应用开发 【免费下载链接】pwa-asset-generator Automates PWA asset generation and image declaration. Automatically generates icon and splash screen images, favicons and mstile images. Updates ma…

作者头像 李华
网站建设 2026/3/5 11:15:41

Minecraft世界下载器完整使用教程:快速保存服务器地图

想要永久保存你在Minecraft服务器上精心建造的家园吗?或者想要离线探索那些令人惊叹的公共服务器世界?Minecraft世界下载器正是你需要的工具。这款强大的工具能够让你轻松下载任何支持版本的Minecraft世界数据,从1.12.2到最新的1.20.1版本都完…

作者头像 李华
网站建设 2026/3/4 21:51:27

网卡 `bond0` RX dropped 排查笔记(详尽版)

目录标题网卡 bond0 RX dropped 排查笔记(详尽版)一、现象与结论速览二、可能原因(按优先级,从常见到罕见)三、必要信息与准备(先收集这些)四、逐步排查流程(详尽步骤,按…

作者头像 李华