导航:首页 > 源码编译 > pagerank算法实现java

pagerank算法实现java

发布时间:2024-02-02 21:06:13

1. pagerank是什么

PageRank是Google衡量网页重要性的工具,测量值范围为从1至10分别表示某网页的重要性。在Google工具栏可以随时获得某网页的PageRank值。在这里我们将透视PageRank的一些特殊之处,从而对其能够获得较为深入的了解,使广大用户能够更好的使用和了解Googel。

网站 排名的历史渊源

上世纪90年代早期网络刚刚兴起之时,每天都有大量的含有特别行业内容的站点发布于网上。网上冲浪者却没有相应的工具定位这些他们认为存在的,但是却没有办法找到域名或网址的站点。到了1993年,雅虎诞生了。雅虎的诞生为网民减轻了这些烦恼。雅虎最初将每一个它所找到的网站,按照所属的分类目录进行划分组织,建立起一个整洁的、可以逐级查找的数据库,雅虎同时也在网站上置入一个 搜索引擎可以根据数据库中存在的“关键词”搜索到网站。接着其他搜索引擎如Altavista ,Excite, Lycos等也相继推出供用户使用的搜索工具。他们中的大多数是根据找到的元标识中的关键词来识别网站的相关性。

事情好像发展地很顺利,但是当站主及网管意识到可以在元标识中插入行业关键词或其他站点代码,就可以巧妙的得到搜索结果页面上的较高的位置的时候问题来了。有一段时间,搜索引擎的结果被这些垃圾网站搞得乱七八糟,他们用某些相关的关键词充斥于网站的各个角落,可是展现在用户面前的实际内容确实糟糕透顶。那些信用较高、地位重要的搜索引擎开始受到挑战,他们必须采取更好的措施精确为用户输出的搜索结果。

Google网页级别祥解

Google意识到了传统搜索引擎所面临的这种问题。如果相关性有网管来控制的话,那么排名结果必将被他们人为安排的大量相关关键词所污染,掩蔽了真正的相关性。

网络的本质就是超链接。我们从逻辑上分析,每个人都让自己的网站与某些重要的站点相链接,那么,本质上,这个站点就投了对方的一票。当上百上千个站点链接到这个站点时,我们认为这个站点是一个很好的很重要的站点也就非常符合逻辑了。

就是在这样的逻辑推理下,Google的两位创始人Sergey Brin及Larry Page建立了一个搜索引擎算法公式,即将排名比重转移到了网页意外的因素上。他们的公式被命名为“PageRank”(以创建人Larry Page的名字命名)。Google就是利用这一公式计算链接到某一网页的网站数量,然后按照从1-10分别给予表示重要度的分数。链接到网页的站点越多,PageRank的分数越高。

Sergey Brin和Larry Page在1998年把PageRank技术配置进Google一同推出。结果出乎的成功。Google这种难以认为控制的算法公司得出的出众的相关结果大大超过了竞争对手。这种新的算法不仅有助于提供出权威的高质量的信息,而且使得站主即网管很难利用作弊手段取得较高排名。

Google的PageRank之所以如此重要,就是因为影响网页排名的因素主要是依赖于网页意外的因素,而非能够认为操纵的因素。

Google对PageRank的解释

在Google网站上有一个专门的域名介绍PageRank(http://www.Google.com/technology/)

PageRank完全依靠的是网络的民主特性,利用大量的链接结构表明某个单独页面的价值。本质上来说,Google把链接转换为一次投票,当从网页 A 链接到网页 B 时,Google 就认为“网页 A 投了网页 B 一票”。 Google 也不是纯粹考虑投票的数量,还对投票的网页进行分析。本身很重要的网页的投票有助于增强其他对方网页的重要度。

重要的是,Google会记录每次的搜索行为,高质量的网站能够获得较高的PageRank分值。当然,重要的网页如果不能匹配你的查询就没有任何价值。所以,Google把PageRank技术及文本匹配技术进行结合从而搜索出既重要又相关的的结果。Google的匹配技术不是只考虑词条在网页上的出现次数,而是检查网页内容(及链接网页的内容)的所有方面,从而决定该网页是否匹配你的查询。

更多信息访问Google PageRank介绍:

搜索引擎排名与PageRank的关系

虽然每个搜索引擎都严格保密各自的明确的搜索算法,但是搜索引擎分析人士相信搜索引擎结果(排名列表)是“Page Relevance”与“PageRank”因素综合承继的结果。

Ranking = (Page Relevance) x (PageRank)

PageRank逻辑算法无疑是具有重大意义的,而且这种算法不能够被网管人员轻易操纵。Google的搜索结果能够显示出如此高的相关性无疑也是它能够获得彻底成功的重要原因之一。大多数其他搜索引擎已经完全采用同类模式作为自己的搜索算法,而有的搜索引擎将这种算法在决定结果排名中的重要程度进行定义后应用与自己的搜索结果中。
自网络发展的初期,搜索引擎就一直不断的努力试图开发出可以排列相关网页的搜索算法。大多数搜索引擎重视于“链接流行度”(link popularity),作为评价网页重要度及用于索引的标准

Google 工具栏

Google工具栏供人免费下载安装,除了某些有用的功能外,比较显着的一个特点就是它可以告诉用户目前正在访问的每个网页的PageRank值。

下载后的Google工具栏位于浏览器窗口下部,可随时随地进行网上搜索。工具栏显示出每个页面从1-10不等的PageRank分值。对于Google未索引的网页,工具栏不会显示出该页的PageRank分值。需要提醒的是,该分值是针对网页而言,而非网站。

注:PR值越高,说明营销人员要针对相应的搜索词条获得较高的排名位置就有更多的竞争。所以,我们建议根据关键词优化你的网页PR值。

什么是链接流行度?

“链接流行度”系统是基于网页获得的链接的数量及质量而定的。也就是说,指向你的网页的链接数量越多,你的网页将被搜索引擎认为越重要。数量并不是决定网站重要度的唯一因素,重要度还取决于其他因素,包括被链接到本站点的站点的质量、他们的内容的质量及与本站点的行业相关性等。

链接到本站点的网页会把PageRank的部分分值分配到本站点。所以链接页面的PageRank分值越高,分配给本站点的分值也就越高。

PageRank也会被链接页面商店所有导出链接所瓜分。譬如,同样PR为5的链接网页,导出链接只有15个的网页会比导出链接为100个的网页分配给你更多的分值。

所以重要的是要从PR值较高并且总体导出链接数量较少网页才能获得安全链接。

如何检测链接流行度

最简单的检测网站流行度的方法就是利用Google搜索,方法如下:

link:www.yoursite.com

其它主要搜索引擎在搜索你的链接流行度时都有不同的规则。

建立链接流行度提高PageRank

建立链接流行度是搜索引擎营销的一个重要方面。尽管认为的提高PageRank不是意见容易的事,但是你通过改善链接流行度就可以不难做到。通过长期不懈的关注建立链接的工作,你就会提高站点的PageRank,大大改善自己的站点排名。

就在不久前,Google及其他搜索引擎配制了某些类似与PageRank的算法成分(如TSPR”Topic Sensitive PageRank”,Hilltop“Links from expert document.”),进一步将决定排名的比重放置在页面以外因素上。
随着页面以外因素在网站排名中受到重视,所以提高加强这些因素的重视就变得越来越重要。当越来越多的网管意识到PageRank及链接流行度的重要性时,就不难在同行业中与其他站点进行链接交换了。

2. 数据挖掘算法 PageRank

数据挖掘算法:PageRank
1. 引言
PageRank是Sergey Brin与Larry Page于1998年在WWW7会议上提出来的,用来解决链接分析中网页排名的问题。在衡量一个网页的排名,直觉告诉我们:
1、当一个网页被更多网页所链接时,其排名会越靠前;
2、排名高的网页应具有更大的表决权,即当一个网页被排名高的网页所链接时,其重要性也应对应提高。
对于这两个直觉,PageRank算法所建立的模型非常简单:一个网页的排名等于所有链接到该网页的网页的加权排名之和:

PRi表示第i个网页的PageRank值,用以衡量每一个网页的排名;若排名越高,则其PageRank值越大。
网页之间的链接关系可以表示成一个有向图代表了网页j链接到了网页i;Oj为网页j的出度,也可看作网页j的外链数( the number of out-links)。
假定P=(PR1,PR2,?,PRn)T为n维PageRank值向量,A为有向图G所对应的转移矩阵,

n个等式(1)可改写为矩阵相乘:

但是,为了获得某个网页的排名,而需要知道其他网页的排名,这不就等同于“是先有鸡还是先有蛋”的问题了么?幸运的是,PageRank采用power iteration方法破解了这个问题怪圈。欲知详情,请看下节分解。
2. 求解
为了对上述及以下求解过程有个直观的了解,我们先来看一个例子,网页链接关系图如下图所示:

那么,矩阵A即为

所谓power iteration,是指先给定一个P的初始值P0,然后通过多轮迭代求解:

最后收敛于||Pk?Pk?1||<ξ,即差别小于某个阈值。
我们发现式子(2)为一个特征方程(characteristic equation),并且解P是当特征值(eigenvalue)为1时的特征向量(eigenvector)。为了满足(2)是有解的,则矩阵A应满足如下三个性质:
1、stochastic matrix,则行至少存在一个非零值,即必须存在一个外链接(没有外链接的网页被称为dangling pages);
2、不可约(irrecible),即矩阵A所对应的有向图G必须是强连通的,对于任意两个节点u,v∈V,存在一个从u到v的路径;
3、非周期性(aperiodic),即每个节点存在自回路。
显然,一般情况下矩阵A这三个性质均不满足。为了满足性质stochastic matrix,可以把全为0的行替换为e/n,其中e为单位向量;同时为了满足性质不可约、非周期,需要做平滑处理:

其中,d为 damping factor,常置为0与1之间的一个常数;E为单位阵。那么,式子(1)被改写为

3. Pagerank算法

一. Pagerank介绍
PageRank算法以前就是Google的网页排序算法。PageRank算法,对每个目标网页进行附上权值,权值大的就靠前显示,权值小的就靠后显示。PageRank算法就是给每个网页附加权值的。PageRank算法借鉴学术界论文重要性的评估方法:谁被引用的次数多,谁就越重要。
注:PageRank算法不单单是按照“被索引数”来给网页付权值的,用PR值表示每个网页被PageRank算法附加的权值。

二. PageRank算法的核心细想
(1)如果一个网页被很多其他网页链接到的话,说明这个网页比较重要,也就是PageRank值会相对较高
(2)如果一个PageRank值很高的网页链接到一个其他的网页,那么被链接到的网页的PageRank值会相应地因此而提高

三. 基本概念
(1)出链

如果在网页A中附加了网页B的超链接B-Link,用户浏览网页A时可以点击B-Link然后进入网页B。上面这种A附有B-Link这种情况表示A出链B。可知,网页A也可以出链C,如果A中也附件了网页C的超链接C-Link。

(2)入链

上面通过点击网页A中B-Link进入B,表示由A入链B。如果用户自己在浏览器输入栏输入网页B的URL,然后进入B,表示用户通过输入URL入链B

(3)无出链

如果网页A中没有附加其他网页的超链接,则表示A无出链

(4)只对自己出链

如果网页A中没有附件其他网页的超链接,而只有他自己的超链接A-Link,则表示A只对自己出链

(5)PR值

一个网页的PR值,概率上理解就是此网页被访问的概率,PR值越高其排名越高。

四. 几种网页出入链关系
case1:网页都有出入链

case2:存在没有出链的网页

网页C是没有出链。因为C没有出链,所以对A,B,D网页没有PR值的贡献。PageRank算法的策略:从数学上考虑,为了满足Markov链,设定C对A,B,C,D都有出链(也对他自己也出链~)。你也可以理解为:没有出链的网页,我们强制让他对所有的网页都有出链,即让他对所有网页都有PR值贡献。
此种情况PR(A)的计算公式:

case3:存在只对自己出链的网页

C是只对自己出链的网页。

此时访问C时,不会傻乎乎的停留在C页面,一直点击C-Link循环进入C,即C网页只对自己的网页PR值有贡献。正常的做法是,进入C后,存在这种情况:在地址输入栏输入A/B/C/D的URL地址,然后跳转到A/B/C/D进行浏览,这就是PageRank算法解决这种情况的策略:设定存在一定概率为α,用户在地址栏输入A/B/C/D地址,然后从C跳转到A/B/C/D进行浏览。
此时PR(A)的计算公式为:

五. 算法公式
一般情况下,一个网页的PR值计算公式为:

所有网页PR值一直迭代计算,停止直到下面两种情况之一发生:每个网页的PR值前后误差小于自定义误差阈值,或者迭代次数超过了自定义的迭代次数阈值

六. PageRank算法的缺点
这是一个天才的算法,原理简单但效果惊人。然而,PageRank算法还是有一些弊端。

第一,没有区分站内导航链接。很多网站的首页都有很多对站内其他页面的链接,称为站内导航链接。这些链接与不同网站之间的链接相比,肯定是后者更能体现PageRank值的传递关系。

第二,没有过滤广告链接和功能链接(例如常见的“分享到微博”)。这些链接通常没有什么实际价值,前者链接到广告页面,后者常常链接到某个社交网站首页。

第三,对新网页不友好。一个新网页的一般入链相对较少,即使它的内容的质量很高,要成为一个高PR值的页面仍需要很长时间的推广。

针对PageRank算法的缺点,有人提出了TrustRank算法。其最初来自于2004年斯坦福大学和雅虎的一项联合研究,用来检测垃圾网站。TrustRank算法的工作原理:先人工去识别高质量的页面(即“种子”页面),那么由“种子”页面指向的页面也可能是高质量页面,即其TR值也高,与“种子”页面的链接越远,页面的TR值越低。“种子”页面可选出链数较多的网页,也可选PR值较高的网站。

TrustRank算法给出每个网页的TR值。将PR值与TR值结合起来,可以更准确地判断网页的重要性。

补充:
谷歌用PR值来划分网页的等级,有0~10级,一般4级以上的都是比较好的网页了。谷歌自己PR值为9,网络也是9,博客园的PR值则为6。

如今PR值虽不如以前重要了(没有区分页面内的导航链接、广告链接和功能链接导致PR值本身能够反映出的网页价值不精确,并且对新网页不友好),但是流量交易里PR值还是个很重要的参考因素。

4. pagerank算法是什么

PageRank算法是谷歌曾经独步天下的“倚天剑”,该算法由Larry Page和Sergey Brin在斯坦福大学读研时发明的。PageRank,网页排名,又称为网页级别,Google左侧排名,是一种由网页之间相互的超链接计算的技术,作为网页排名的要素之一。

Google用它来体现网页的相关性和重要性,在搜索引擎优化操作中是经常被用来评估网页优化的成效因素之一。

PageRank的思想

PageRank认为,一个节点对系统施加影响的结果,就是与它相连的节点也具有一定的影响力。PageRank的想法看起来很简单,实际上给我们留了一个难题:各个节点的PR值计算是存在依赖的,得先计算出PR(node1)才能计算PR(node0)。

也就是说需要首先把所有未被引用的节点的PR值算出来(一般默认是1.0);然后把以它们为源头、只和源头相连、距离为1的节点的PR值算出来;接着计算距离为2、只和已经具有PR值节点相连的,所有节点的PR值;直到所有的节点都有PR值为止。这个计算方法复杂度比较高,不实用。

5. hadoop的maprece常见算法案例有几种

基本MapRece模式

计数与求和
问题陈述:
有许多文档,每个文档都有一些字段组成。需要计算出每个字段在所有文档中的出现次数或者这些字段的其他什么统计值。例如,给定一个log文件,其中的每条记录都包含一个响应时间,需要计算出平均响应时间。
解决方案:
让我们先从简单的例子入手。在下面的代码片段里,Mapper每遇到指定词就把频次记1,Recer一个个遍历这些词的集合然后把他们的频次加和。

1 class Mapper
2 method Map(docid id, doc d)
3 for all term t in doc d do
4 Emit(term t, count 1)
5
6 class Recer
7 method Rece(term t, counts [c1, c2,...])
8 sum = 0
9 for all count c in [c1, c2,...] do
10 sum = sum + c
11 Emit(term t, count sum)

这种方法的缺点显而易见,Mapper提交了太多无意义的计数。它完全可以通过先对每个文档中的词进行计数从而减少传递给Recer的数据量:

1 class Mapper
2 method Map(docid id, doc d)
3 H = new AssociativeArray
4 for all term t in doc d do
5 H{t} = H{t} + 1
6 for all term t in H do
7 Emit(term t, count H{t})

如果要累计计数的的不只是单个文档中的内容,还包括了一个Mapper节点处理的所有文档,那就要用到Combiner了:

1 class Mapper
2 method Map(docid id, doc d)
3 for all term t in doc d do
4 Emit(term t, count 1)
5
6 class Combiner
7 method Combine(term t, [c1, c2,...])
8 sum = 0
9 for all count c in [c1, c2,...] do
10 sum = sum + c
11 Emit(term t, count sum)
12
13 class Recer
14 method Rece(term t, counts [c1, c2,...])
15 sum = 0
16 for all count c in [c1, c2,...] do
17 sum = sum + c
18 Emit(term t, count sum)

应用:Log 分析, 数据查询

整理归类

问题陈述:
有一系列条目,每个条目都有几个属性,要把具有同一属性值的条目都保存在一个文件里,或者把条目按照属性值分组。 最典型的应用是倒排索引。
解决方案:
解决方案很简单。 在 Mapper 中以每个条目的所需属性值作为 key,其本身作为值传递给 Recer。 Recer 取得按照属性值分组的条目,然后可以处理或者保存。如果是在构建倒排索引,那么 每个条目相当于一个词而属性值就是词所在的文档ID。
应用:倒排索引, ETL
过滤 (文本查找),解析和校验
问题陈述:
假设有很多条记录,需要从其中找出满足某个条件的所有记录,或者将每条记录传换成另外一种形式(转换操作相对于各条记录独立,即对一条记录的操作与其他记录无关)。像文本解析、特定值抽取、格式转换等都属于后一种用例。
解决方案:
非常简单,在Mapper 里逐条进行操作,输出需要的值或转换后的形式。
应用:日志分析,数据查询,ETL,数据校验

分布式任务执行

问题陈述:
大型计算可以分解为多个部分分别进行然后合并各个计算的结果以获得最终结果。
解决方案: 将数据切分成多份作为每个 Mapper 的输入,每个Mapper处理一份数据,执行同样的运算,产生结果,Recer把多个Mapper的结果组合成一个。
案例研究: 数字通信系统模拟
像 WiMAX 这样的数字通信模拟软件通过系统模型来传输大量的随机数据,然后计算传输中的错误几率。 每个 Mapper 处理样本 1/N 的数据,计算出这部分数据的错误率,然后在 Recer 里计算平均错误率。
应用:工程模拟,数字分析,性能测试
排序
问题陈述:
有许多条记录,需要按照某种规则将所有记录排序或是按照顺序来处理记录。
解决方案: 简单排序很好办 – Mappers 将待排序的属性值为键,整条记录为值输出。 不过实际应用中的排序要更加巧妙一点, 这就是它之所以被称为MapRece 核心的原因(“核心”是说排序?因为证明Hadoop计算能力的实验是大数据排序?还是说Hadoop的处理过程中对key排序的环节?)。在实践中,常用组合键来实现二次排序和分组。
MapRece 最初只能够对键排序, 但是也有技术利用可以利用Hadoop 的特性来实现按值排序。想了解的话可以看这篇博客。
按照BigTable的概念,使用 MapRece来对最初数据而非中间数据排序,也即保持数据的有序状态更有好处,必须注意这一点。换句话说,在数据插入时排序一次要比在每次查询数据的时候排序更高效。
应用:ETL,数据分析

非基本 MapRece 模式

迭代消息传递 (图处理)

问题陈述:
假设一个实体网络,实体之间存在着关系。 需要按照与它比邻的其他实体的属性计算出一个状态。这个状态可以表现为它和其它节点之间的距离, 存在特定属性的邻接点的迹象, 邻域密度特征等等。
解决方案:
网络存储为系列节点的结合,每个节点包含有其所有邻接点ID的列表。按照这个概念,MapRece 迭代进行,每次迭代中每个节点都发消息给它的邻接点。邻接点根据接收到的信息更新自己的状态。当满足了某些条件的时候迭代停止,如达到了最大迭代次数(网络半径)或两次连续的迭代几乎没有状态改变。从技术上来看,Mapper 以每个邻接点的ID为键发出信息,所有的信息都会按照接受节点分组,recer 就能够重算各节点的状态然后更新那些状态改变了的节点。下面展示了这个算法:

1 class Mapper
2 method Map(id n, object N)
3 Emit(id n, object N)
4 for all id m in N.OutgoingRelations do
5 Emit(id m, message getMessage(N))
6
7 class Recer
8 method Rece(id m, [s1, s2,...])
9 M = null
10 messages = []
11 for all s in [s1, s2,...] do
12 if IsObject(s) then
13 M = s
14 else // s is a message
15 messages.add(s)
16 M.State = calculateState(messages)
17 Emit(id m, item M)

一个节点的状态可以迅速的沿着网络传全网,那些被感染了的节点又去感染它们的邻居,整个过程就像下面的图示一样:

案例研究: 沿分类树的有效性传递
问题陈述:
这个问题来自于真实的电子商务应用。将各种货物分类,这些类别可以组成一个树形结构,比较大的分类(像男人、女人、儿童)可以再分出小分类(像男裤或女装),直到不能再分为止(像男式蓝色牛仔裤)。这些不能再分的基层类别可以是有效(这个类别包含有货品)或者已无效的(没有属于这个分类的货品)。如果一个分类至少含有一个有效的子分类那么认为这个分类也是有效的。我们需要在已知一些基层分类有效的情况下找出分类树上所有有效的分类。
解决方案:
这个问题可以用上一节提到的框架来解决。我们咋下面定义了名为 getMessage和 calculateState 的方法:

1 class N
2 State in {True = 2, False = 1, null = 0},
3 initialized 1 or 2 for end-of-line categories, 0 otherwise
4 method getMessage(object N)
5 return N.State
6 method calculateState(state s, data [d1, d2,...])
7 return max( [d1, d2,...] )

案例研究:广度优先搜索
问题陈述:需要计算出一个图结构中某一个节点到其它所有节点的距离。
解决方案: Source源节点给所有邻接点发出值为0的信号,邻接点把收到的信号再转发给自己的邻接点,每转发一次就对信号值加1:

1 class N
2 State is distance,
3 initialized 0 for source node, INFINITY for all other nodes
4 method getMessage(N)
5 return N.State + 1
6 method calculateState(state s, data [d1, d2,...])
7 min( [d1, d2,...] )

案例研究:网页排名和 Mapper 端数据聚合
这个算法由Google提出,使用权威的PageRank算法,通过连接到一个网页的其他网页来计算网页的相关性。真实算法是相当复杂的,但是核心思想是权重可以传播,也即通过一个节点的各联接节点的权重的均值来计算节点自身的权重。

1 class N
2 State is PageRank
3 method getMessage(object N)
4 return N.State / N.OutgoingRelations.size()
5 method calculateState(state s, data [d1, d2,...])
6 return ( sum([d1, d2,...]) )

要指出的是上面用一个数值来作为评分实际上是一种简化,在实际情况下,我们需要在Mapper端来进行聚合计算得出这个值。下面的代码片段展示了这个改变后的逻辑 (针对于 PageRank 算法):

1 class Mapper
2 method Initialize
3 H = new AssociativeArray
4 method Map(id n, object N)
5 p = N.PageRank / N.OutgoingRelations.size()
6 Emit(id n, object N)
7 for all id m in N.OutgoingRelations do
8 H{m} = H{m} + p
9 method Close
10 for all id n in H do
11 Emit(id n, value H{n})
12
13 class Recer
14 method Rece(id m, [s1, s2,...])
15 M = null
16 p = 0
17 for all s in [s1, s2,...] do
18 if IsObject(s) then
19 M = s
20 else
21 p = p + s
22 M.PageRank = p
23 Emit(id m, item M)

应用:图分析,网页索引

值去重 (对唯一项计数)
问题陈述: 记录包含值域F和值域 G,要分别统计相同G值的记录中不同的F值的数目 (相当于按照 G分组).
这个问题可以推而广之应用于分面搜索(某些电子商务网站称之为Narrow Search)
Record 1: F=1, G={a, b}
Record 2: F=2, G={a, d, e}
Record 3: F=1, G={b}
Record 4: F=3, G={a, b}

Result:
a -> 3 // F=1, F=2, F=3
b -> 2 // F=1, F=3
d -> 1 // F=2
e -> 1 // F=2

解决方案 I:
第一种方法是分两个阶段来解决这个问题。第一阶段在Mapper中使用F和G组成一个复合值对,然后在Recer中输出每个值对,目的是为了保证F值的唯一性。在第二阶段,再将值对按照G值来分组计算每组中的条目数。
第一阶段:

1 class Mapper
2 method Map(null, record [value f, categories [g1, g2,...]])
3 for all category g in [g1, g2,...]
4 Emit(record [g, f], count 1)
5
6 class Recer
7 method Rece(record [g, f], counts [n1, n2, ...])
8 Emit(record [g, f], null )

第二阶段:

1 class Mapper
2 method Map(record [f, g], null)
3 Emit(value g, count 1)
4
5 class Recer
6 method Rece(value g, counts [n1, n2,...])
7 Emit(value g, sum( [n1, n2,...] ) )

解决方案 II:
第二种方法只需要一次MapRece 即可实现,但扩展性不强。算法很简单-Mapper 输出值和分类,在Recer里为每个值对应的分类去重然后给每个所属的分类计数加1,最后再在Recer结束后将所有计数加和。这种方法适用于只有有限个分类,而且拥有相同F值的记录不是很多的情况。例如网络日志处理和用户分类,用户的总数很多,但是每个用户的事件是有限的,以此分类得到的类别也是有限的。值得一提的是在这种模式下可以在数据传输到Recer之前使用Combiner来去除分类的重复值。

1 class Mapper
2 method Map(null, record [value f, categories [g1, g2,...] )
3 for all category g in [g1, g2,...]
4 Emit(value f, category g)
5
6 class Recer
7 method Initialize
8 H = new AssociativeArray : category -> count
9 method Rece(value f, categories [g1, g2,...])
10 [g1', g2',..] = ExcludeDuplicates( [g1, g2,..] )
11 for all category g in [g1', g2',...]
12 H{g} = H{g} + 1
13 method Close
14 for all category g in H do
15 Emit(category g, count H{g})

应用:日志分析,用户计数
互相关
问题陈述:有多个各由若干项构成的组,计算项两两共同出现于一个组中的次数。假如项数是N,那么应该计算N*N。
这种情况常见于文本分析(条目是单词而元组是句子),市场分析(购买了此物的客户还可能购买什么)。如果N*N小到可以容纳于一台机器的内存,实现起来就比较简单了。
配对法
第一种方法是在Mapper中给所有条目配对,然后在Recer中将同一条目对的计数加和。但这种做法也有缺点:
使用 combiners 带来的的好处有限,因为很可能所有项对都是唯一的
不能有效利用内存

1 class Mapper
2 method Map(null, items [i1, i2,...] )
3 for all item i in [i1, i2,...]
4 for all item j in [i1, i2,...]
5 Emit(pair [i j], count 1)
6
7 class Recer
8 method Rece(pair [i j], counts [c1, c2,...])
9 s = sum([c1, c2,...])
10 Emit(pair[i j], count s)

Stripes Approach(条方法?不知道这个名字怎么理解)
第二种方法是将数据按照pair中的第一项来分组,并维护一个关联数组,数组中存储的是所有关联项的计数。The second approach is to group data by the first item in pair and maintain an associative array (“stripe”) where counters for all adjacent items are accumulated. Recer receives all stripes for leading item i, merges them, and emits the same result as in the Pairs approach.
中间结果的键数量相对较少,因此减少了排序消耗。
可以有效利用 combiners。
可在内存中执行,不过如果没有正确执行的话也会带来问题。
实现起来比较复杂。
一般来说, “stripes” 比 “pairs” 更快

1 class Mapper
2 method Map(null, items [i1, i2,...] )
3 for all item i in [i1, i2,...]
4 H = new AssociativeArray : item -> counter
5 for all item j in [i1, i2,...]
6 H{j} = H{j} + 1
7 Emit(item i, stripe H)
8
9 class Recer
10 method Rece(item i, stripes [H1, H2,...])
11 H = new AssociativeArray : item -> counter
12 H = merge-sum( [H1, H2,...] )
13 for all item j in H.keys()
14 Emit(pair [i j], H{j})

应用:文本分析,市场分析
参考资料:Lin J. Dyer C. Hirst G. Data Intensive Processing MapRece
用MapRece 表达关系模式
在这部分我们会讨论一下怎么使用MapRece来进行主要的关系操作。
筛选(Selection)

1 class Mapper
2 method Map(rowkey key, tuple t)
3 if t satisfies the predicate
4 Emit(tuple t, null)

投影(Projection)
投影只比筛选稍微复杂一点,在这种情况下我们可以用Recer来消除可能的重复值。

1 class Mapper
2 method Map(rowkey key, tuple t)
3 tuple g = project(t) // extract required fields to tuple g
4 Emit(tuple g, null)
5
6 class Recer

阅读全文

与pagerank算法实现java相关的资料

热点内容
lk4102加密芯片 浏览:586
怎么更改app店面 浏览:485
设备部门如何做好服务器 浏览:847
androido下载 浏览:476
神奇高量战法副图源码 浏览:828
汇编语言设计凯撒密码加密器 浏览:390
主次梁加密是加在哪里 浏览:662
模板匹配算法matlab 浏览:823
外地程序员去北京 浏览:22
安卓机换苹果12如何转移数据 浏览:418
互联网ntp服务器地址及端口 浏览:613
pdf到word转换器 浏览:267
飞行解压素材 浏览:498
51单片机指令用背吗 浏览:936
unityai算法 浏览:834
我的世界ice服务器如何打开pvp 浏览:975
c语言编程如何做标记 浏览:884
python数据分析实战pdf 浏览:985
u盘插入文件夹 浏览:918
华为amd云服务器 浏览:497