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

文章目录

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

    scala 复制代码
    // 创建顶点 RDD
    val users: RDD[(VertexId, (String, String))] = sc.textFile("hdfs://master:9000/graphx/data/vertices.txt")
      .map { line =>
        val fields = line.split(" ")
        (fields(0).toLong, (fields(1), fields(2)))
      }
    
    // 创建边 RDD
    val relationships: RDD[Edge[String]] = sc.textFile("hdfs://master:9000/graphx/data/edges.txt")
      .map { line =>
        val fields = line.split(" ")
        Edge(fields(0).toLong, fields(1).toLong, fields(2))
      }
    
    // 定义默认用户(用于处理缺失顶点)
    val defaultUser = ("Black Smith", "Missing")
    
    // 构建图对象
    val graph_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()方法创建图

    scala 复制代码
    // 读取边数据文件
    val records: RDD[String] = sc.textFile("hdfs://master:9000/graphx/data/edges.txt")
    
    // 解析每行数据为 Edge 对象
    val followers: RDD[Edge[String]] = records.map { line =>
      val fields = line.split(" ")
      Edge(fields(0).toLong, fields(1).toLong, fields(2))
    }
    
    // 基于边构建图(顶点属性统一设为默认值 1L)
    val graphFromEdges = 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()方法创建图

    scala 复制代码
    // 读取边数据文件
    val records: RDD[String] = sc.textFile("hdfs://master:9000/graphx/data/edges.txt")
    
    // 解析为 (srcId, dstId) 二元组 RDD
    val edgesRDD: RDD[(VertexId, VertexId)] = records
      .map(line => line.split(" "))
      .map(fields => (fields(0).toLong, fields(1).toLong))
    
    // 基于边二元组构建图(顶点属性设为默认值 1L)
    val graphFromEdgeTuples = 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. 实战总结

相关推荐
Light601 天前
领码 SPARK aPaaS 前端开发体系 技术架构(最终版)
低代码·spark·前端架构·apaas·模型驱动·能力分层·上下文契约
【赫兹威客】浩哥1 天前
【赫兹威客】完全分布式Hive(on Spark)测试教程
hive·分布式·spark
Gain_chance1 天前
19-学习笔记尚硅谷数仓搭建-数据仓库运行环境搭建(spark安装及配置)
数据仓库·笔记·学习·spark
麦兜和小可的舅舅2 天前
Spark to ClickHouse由于DNS问题导致Stage重试的Task竞态分析和问题解决过程
clickhouse·spark
一只大侠的侠2 天前
Spark+Flask新能源车数据分析与推荐系统实战:从0到1搭建完整项目
数据分析·spark·flask
petrel20152 天前
【Spark 核心内参】2025.11:从 ANTLR 的“生态包袱”到远程 Shuffle 的“云原生解药”
大数据·spark
talle20213 天前
Spark分布式计算框架介绍
大数据·分布式·spark·rdd
王九思3 天前
SQL网关 Kyuubi 系列——基本介绍
数据仓库·hive·hadoop·sql·spark
叫我:松哥3 天前
spark+flask的新能源车数据分析与智能推荐系统,融合大数据分析、机器学习和人工智能技术
人工智能·机器学习·信息可视化·数据分析·spark·flask·bootstrap
德彪稳坐倒骑驴3 天前
Spark面试准备
大数据·分布式·spark