Вот псевдокод:
map( key: [url, pagerank], value: outlink_list )
for each outlink in outlink_list
emit( key: outlink, value: pagerank/size(outlink_list) )
emit( key: url, value: outlink_list )
reducer( key: url, value: list_pr_or_urls )
outlink_list = []
pagerank = 0
for each pr_or_urls in list_pr_or_urls
if is_list( pr_or_urls )
outlink_list = pr_or_urls
else
pagerank += pr_or_urls
pagerank = 1 - DAMPING_FACTOR + ( DAMPING_FACTOR * pagerank )
emit( key: [url, pagerank], value: outlink_list )
Важно, чтобы при сокращении вы выводили ссылки, а не ссылки, как предлагают некоторые статьи об интретре. Таким образом, последовательные итерации также будут иметь исходящие ссылки в качестве входных данных преобразователя.
Обратите внимание, что несколько исходящих ссылок с одним и тем же адресом на одной странице учитываются как одно. Кроме того, не считайте циклы (страница, ссылающаяся на себя).
Коэффициент демпфирования традиционно составляет 0,85, хотя вы можете поиграть и с другими значениями.