IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> Spark_GraphX_2 -> 正文阅读

[大数据]Spark_GraphX_2

文章目录

1.PageRank

历史上,PageRank算法作为计算互联网网页重要度的算法被提出。PageRank是定义在网页集合上的一个函数,它对每个网页给出一个正实数,表示网页的重要程度,整体构成一个向量,PageRank值越高,网页就越重要,在互联网搜索的排序中可能就被排在前面。

直观上,一个网页,如果指向该网页的超链接越多,随机跳转到该网页的概率也就越高,该网页的PageRank值就越高,这个网页也就越重要。一个网页,如果指向该网页的PageRank值越高,随机跳转到该网页的概率也就越高,该网页的PageRank值就越高,这个网页也就越重要。PageRank值依赖于网络的拓扑结构,一旦网络的拓扑(连接关系)确定,PageRank值就确定。

  • PR值计算公式:v’=αMv+(1-α)e

在这里插入图片描述

object PageRank {
  def main(args: Array[String]): Unit = {
    val spark = SparkSession.builder().master("local[*]").appName("graph").getOrCreate()
    val sc = spark.sparkContext
    val users = sc.makeRDD(Array(
      (1L, ("Alice", 28)),
      (2L, ("Bob", 27)),
      (3L, ("Charlie", 65)),
      (4L, ("David", 42)),
      (5L, ("Ed", 55)),
      (6L, ("Fran", 42))))
    val relationship = sc.makeRDD(Array(
      Edge(2L, 1L, 7),
      Edge(3L, 2L, 4),
      Edge(4L, 1L, 1),
      Edge(2L, 4L, 2),
      Edge(5L, 2L, 2),
      Edge(5L, 3L, 8),
      Edge(5L, 6L, 3),
      Edge(3L, 6L, 3)
    ))

    val graph = Graph(users, relationship)

    graph.pageRank(0.001).vertices.foreach(println)
  }
}
(2,0.9969646507526427)
(5,0.5451618049228395)
(1,1.7924127957615184)
(3,0.6996243163176441)
(6,0.9969646507526427)

算法: pageRank

2.Pregel

Pregel 是 Google 自 2009 年开始对外公开的图计算算法和系统, 主要用于解决无法在单机环境下计算的大规模图论计算问题。与其说 Pregel 是图计算的算法, 不如说它是一系列算法、模型和系统设计组合在一起形成的一套图模型处理方案。

Pregel算法一般用来求最短路径问题

图顶点的两个状态:

  • 钝化状态:类似于休眠,激活状态的顶点若本轮迭代中未成功发送或接收消息的顶点在下次迭代中将变为钝化状态
  • 激活状态:工作状态,每轮迭代都将尝试向周边顶点发送消息,钝化状态的顶点在成功接收消息后在下次迭代中将变为激活状态

过程:

  1. 以顶点的属性值代表与起点的距离,所以初始给起点赋值为0,其余顶点赋值一个极大值。
  2. 所有顶点起始状态为激活状态
  3. 以边的属性代表src到dst的距离,消息发送成功的标准为发送端属性与边属性之和小于接受端属性。
  4. 接收端接收到消息后,会更新自己的属性值
  5. 第一轮遍历后,由于除起点外其他顶点属性值均为极大值,只有起点和起点能直接到达的点处于激活状态,其他顶点切换至钝化状态
  6. 多轮迭代中,起点和靠近起点的顶点将逐渐进行钝化状态,远离起点的顶点将进入激活状态
  7. 最终,所有顶点都将进入钝化状态,当所有顶点进入钝化状态后,计算结束。此时所有顶点的属性值即为到起点的距离
object PregelTest{
  def main(args: Array[String]): Unit = {
    val spark = SparkSession.builder().master("local[*]").appName("graph").getOrCreate()
    val sc = spark.sparkContext
    val users = sc.makeRDD(Array(
      (1L, ("Alice", 28)),
      (2L, ("Bob", 27)),
      (3L, ("Charlie", 65)),
      (4L, ("David", 42)),
      (5L, ("Ed", 55)),
      (6L, ("Fran", 42))))
    val relationship = sc.makeRDD(Array(
      Edge(2L, 1L, 7),
      Edge(3L, 2L, 4),
      Edge(4L, 1L, 1),
      Edge(2L, 4L, 2),
      Edge(5L, 2L, 2),
      Edge(5L, 3L, 8),
      Edge(5L, 6L, 3),
      Edge(3L, 6L, 3)
    ))

    val graph = Graph(users, relationship)

    val srcVertex = 5L
    // 首先将起始点的属性改为0
    val initGraph = graph.mapVertices {
      case (vid, (name, age)) =>
        if (vid == srcVertex) 0.0 else Double.PositiveInfinity
    }

    val pregelGraph = initGraph.pregel(
      Double.PositiveInfinity,
      Int.MaxValue,
      EdgeDirection.Either // 按边的方向发送消息,OUT和EITHER都可以,不可以设置为IN和BOTH
    )(
      (_: VertexId, vd: Double, disMsg: Double) => math.min(vd, disMsg), 
      (edgeTriplet: EdgeTriplet[Double, PartitionID]) => {
        if (edgeTriplet.srcAttr + edgeTriplet.attr < edgeTriplet.dstAttr) {
          Iterator[(VertexId, Double)]((edgeTriplet.dstId, edgeTriplet.srcAttr + edgeTriplet.attr))
        } else Iterator.empty
      },
      (msg1: Double, msg2: Double) => math.min(msg1, msg2)
    )
    pregelGraph.vertices.foreach(println)
  }
}
(5,0.0)
(4,4.0)
(6,3.0)
(2,2.0)
(3,8.0)
(1,5.0)

Pregel: Pregel

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2022-03-30 18:32:03  更:2022-03-30 18:32:38 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 7:29:44-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码