Learning Spark笔记10-PageRank

PageRank


基于Google的Larry Page命名的PageRank算法旨在根据有多少文档具有链接的方式为一组中的每个文档分配重要度(“等级”)。 它可以用于对网页进行排名,当然也可以是科学文章,也可以用于社交网络中的有影响力的用户。


PageRank是一个迭代算法,它要执行很多连接,所以它很适合RDD分区这种情况。该算法有两个数据集:一个是(pageID,linkList)包含每个页面的相邻链接列表,一个是(pageID,rank)包括每个页面当前的rank。


过程如下:
1.初始化每个页面的rank为1.0
2.每次迭代,发送页面p的rand/numNeighbors到相邻页面(那些链接到它的页面)
3.设置每个页面的rank 0.15+0.85*contributionsReceived


最后两个步骤重复几次迭代,在此期间,算法将收敛到每个页面的正确的PageRank值。 在实践中,这是典型的运行大约10次迭代。


Example 4-25. Scala PageRank
// Assume that our neighbor list was saved as a Spark objectFile
val links = sc.objectFile[(String, Seq[String])]("links")
 .partitionBy(new HashPartitioner(100))
 .persist()
// Initialize each page's rank to 1.0; since we use mapValues, the resulting RDD
// will have the same partitioner as links
var ranks = links.mapValues(v => 1.0)
// Run 10 iterations of PageRank
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)
}
// Write out the final ranks
ranks.saveAsTextFile("ranks")


首先使用join()连接当前的rank RDD和静态链接RDD,为的是与每个页面的ID一起获得rank和链接的列表,然后使用flatMap创建值发送给每个页面的相邻页面。然后我们按页面的ID累加起来,设置页面rank为0.15+0.85*contributionsReceived。


1.注意每次迭代时,链接RDD与rank连接。因此链接是静态的数据集,在一开始就使用partitionBy()分区,所以它就不需要在网络上混洗。实际上,链接RDD也可能在字节上比rank大得多,因为它包含每个页面ID的邻居列表,而不仅仅是一个Double,所以这个优化节省了。
2.处于同样的原因,我们调用persist()将链接RDD保持在RAM中使用
3.当我们创建rank后,我们使用mapValues()代替map()来保留父RDD(links)的分区,所以我们第一次连接是非常廉价的
4.在循环内,在mapValues()之后使用reduceByKey(),因为reduceByKey()的结果已经hash分区了,这样在下一次迭代时将mapped的结果连接到links就会更高效。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

艺菲

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值