网创优客建站品牌官网
为成都网站建设公司企业提供高品质网站建设
热线:028-86922220
成都专业网站建设公司

定制建站费用3500元

符合中小企业对网站设计、功能常规化式的企业展示型网站建设

成都品牌网站建设

品牌网站建设费用6000元

本套餐主要针对企业品牌型网站、中高端设计、前端互动体验...

成都商城网站建设

商城网站建设费用8000元

商城网站建设因基本功能的需求不同费用上面也有很大的差别...

成都微信网站建设

手机微信网站建站3000元

手机微信网站开发、微信官网、微信商城网站...

建站知识

当前位置:首页 > 建站知识

PageRank怎么使用

这篇文章主要讲解了“PageRank怎么使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“PageRank怎么使用”吧!

专注于为中小企业提供成都网站制作、成都网站建设、外贸营销网站建设服务,电脑端+手机端+微信端的三站合一,更高效的管理,为中小企业河南免费做网站提供优质的服务。我们立足成都,凝聚了一批互联网行业人才,有力地推动了成百上千家企业的稳健成长,帮助中小企业通过网站建设实现规模扩充和转变。

PageRank是执行多次连接的一个迭代算法,因此它是RDD分区操作的很好demo,算法维护两个数据集

  1. (pageID,listList) 包含每个页面的相邻页面列表。
  2. (pageID,rank) 包含每个页面的当前排序值, pageRank计算过程大致如下:
  3. 将每个页面的排序值初始化为1.0
  4. 在每次迭代中,对页面p,向其每个相邻页面(有直接连接的页面)发松一个值为 rank(p)/numNeighbors(p)的贡献值。
  5. 将每个页面的排序值设定为 0.15 + 0.85 *contributionsReceived 其中2 跟3 会重复循环几次,在此过程中算法会逐渐收敛于每个页面的实际PageRank值,实际操作中一般迭代10次。
package com.sowhat.spark

import org.apache.spark.rdd.RDD
import org.apache.spark.{HashPartitioner, SparkConf, SparkContext}

/**
* links = (pageID,LinkList)
* ranks = (pageID,rank)
**/
object MyPageRank {
 def main(args: Array[String]): Unit = {
   val conf: SparkConf = new SparkConf().setMaster("local[*]").setAppName("pagerank")

   //创建SparkContext,该对象是提交spark App的入口
   val sc = new SparkContext(conf)

   val links: RDD[(String, Seq[String])] = sc.objectFile[(String, Seq[String])]("filepwd").partitionBy(new HashPartitioner(100)).persist()
   var ranks: RDD[(String, Double)] = links.mapValues(x => 1.0)

   for (i <- 0 until 10) {
     val totalRDD: RDD[(String, (Seq[String], Double))] = links.join(ranks)
     val contributions: RDD[(String, Double)] = totalRDD.flatMap(
       {
         case (pageID, (links, rank)) => links.map(dest => (dest, rank / links.size))
       }
     )
     ranks = contributions.reduceByKey(_ + _).mapValues(v => 0.15 + 0.85 * v)
   }
   ranks.saveAsTextFile("ranks")
 }

}
 

算法从ranksRDD的每个元素的值初始化为1.0开始,然后每次迭代都都不断的更新ranks值,其中主要优化部分如下。

  1. linksRDD每次迭代都会跟ranks发生连接操作,因此将大数据集links进行partitionBy 会节约相当多的网络通信优化开销。
  2. 跟上面的原因一样,用persist 可以将数据保存早内存中,以供每次迭代使用。
  3. 我们在第一次创建ranks时, 我们用mapValues而不是map() 来保留父RDD links的分区方式,这样对第一次连接操作开销减少很多。
  4. 循环体中 reduceByKey后使用mapValues 因为reduceByKey已经是哈希分区了,下一次迭代时候效率更快。

建议:为最大化分区相关优化潜在作用,在无需更改元素键的时候尽量使用 mapValues 或 flatMapValues。

本文使用 mdnice 排版

感谢各位的阅读,以上就是“PageRank怎么使用”的内容了,经过本文的学习后,相信大家对PageRank怎么使用这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是创新互联,小编将为大家推送更多相关知识点的文章,欢迎关注!


文章名称:PageRank怎么使用
标题链接:http://bjjierui.cn/article/pdgjhh.html

其他资讯