PageRank基于Spark实现介绍


该算法为谷歌的拉里•佩奇命名。以迭代方式,根据外部文档指向一个文档的链接来更新每个文档的权重。每个文档给它的相邻文档提供r/n的权值,其中r是该文档的rank,n表示它的邻居文档个数。通过公式a/N +(1-a)*sum(ci) 来更新rank,其中N是文档的总个数,sum(ci)是接收到的权值总和,a可调参数。这样通过提供rank一个初始值,就可以进行迭代更新得到理想的rank,从而对文档排序

在Spark中可以这样实现PageRank

val links = spark.textFile(...).map(...).persist()//相邻页面列表保存于内存中供迭代使用
var ranks = // (url, rank) 给定rank初始值
for (i <- 1 to ITERATIONS) {
// 创建RDD键值对(targetURL, float) 
//(url,(links,rank))=(url,(相邻页面,对应的rank))
val contribs = links.join(ranks).flatMap {
(url, (links, rank)) =>
links.map(dest => (dest, rank/links.size))//=(每个页面,贡献的权值)
}

ranks = contribs.reduceByKey((x,y) => x+y).mapValues(sum => a/N + (1-a)*sum)
}//reduceByKey()合并具有相同键的值,即对每个页面来说,将相邻页面的贡献的权值相加

  

参考 Resilient Distributed Datasets: A Fault-Tolerant Abstraction for In-Memory Cluster Computing

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM