該算法為谷歌的拉里•佩奇命名。以迭代方式,根據外部文檔指向一個文檔的鏈接來更新每個文檔的權重。每個文檔給它的相鄰文檔提供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
