PageRank算法使用Spark-core实现

本文介绍了一个基于Apache Spark的PageRank算法实现案例。该算法通过迭代更新网页排名来确定其重要性,并展示了如何使用Spark RDD进行分区操作。文章还提供了一个包含四个网页节点的小型测试案例。

 PageRank是执行多次连接的一个迭代算法,因此它是RDD分区操作的一个很好的用例。算法会维护两个数据集:一个由(pageID,linkList)的元素组成,包含每个页面的相邻页面的列表;另一个由(pageID,rank)元素组成,包含每个页面的当前排序值。它按如下步骤进行计算。

  1. 将每个页面的排序值初始化为1.0。
  2. 在每次迭代中,对页面p,向其每个相邻页面(有直接链接的页面)发送一个值为rank(p)/numNeighbors(p)的贡献值。
  3. 将每个页面的排序值设为0.15 + 0.85 * contributionsReceived。

        最后两个步骤会重复几个循环,在此过程中,算法会逐渐收敛于每个页面的实际PageRank值。在实际操作中,收敛通常需要大约10轮迭代。

模拟数据
假设一个由4个页面组成的小团体:A,B,C和D。相邻页面如下所示:
A:B C
B:A C
C:A B D
D:C

测试代码


import org.apache.spark.HashPartitioner  
  
val links = sc.parallelize(List(("A",List("B","C")),("B",List("A","C")),("C",List("A","B","D")),("D",List("C")))).partitionBy(new HashPartitioner(100)).persist()  
  
var ranks=links.mapValues(v=>1.0)  
  
for (i <- 0 until 10) {  
val contributions=links.join(ranks).flatMap {  
case (pageId,(links,rank)) => links.map(dest=>(dest,rank/links.size))  
}  
ranks=contributions.reduceByKey((x,y)=>x+y).mapValues(v=>0.15+0.85*v)  
}  
  
ranks.sortByKey().collect()  

 

转载于:https://my.oschina.net/yjwxh/blog/1648166

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值