MapReduce经典案例——倒排索引(1)

一、案例分析

 1、什么是倒排索引

倒排索引是文档检索系统中最常见的数据结构,被广泛的应用于全文搜索引擎。倒排索引主要用来存储某个单词(或词组)。简单的来说就是你搜索一个文档,其中一个文档包含你所提供的关键词,是根据搜索内容确定文档,而不是根据文档来确定内容。因此被称为倒排索引。

建立倒排索引的目的是为了更加方便的搜索,在这里画个图给大家理解一下

在实际应用中,还需要给每个文档添加一个权值,用来指出每个文档与搜索内容的相关度。最常用的是使用词频作为权重,即记录单词或词组在文档中出现的次数,用户在搜索相关文档时,就会把权重高的推荐给客户。下面以英文单词倒排索引为例

如图所示,加权倒排索引文件中,文件每一行内容对每一个单词进行了加权索引、统计出单词出现的文档和次数。例如索引l文件中的第一行, 表示“hadoop”这个单词在文本file1.txt中出现过1次, 在file4.txt中出现过2次, 在file3.txt中出现过1次

2、案例需求及分析

现假设有3个源文件file1.txt、file2.txt和file3.txt, 需要使用倒排索引的方式对这3个源文件内容实现倒排索引,并将最后的倒排索引文件输出,整个过程要求实现如下转换

接下来我们进行具体分析

1、首先使用默认的Text Input Format类对每个输人文件进行处理, 得到文本中每行的偏移量及其内容。Map过程首先分析输人的<key, value>键值对, 经过处理可以得到倒排索引中需要的3个信息:单词、文档名称和词频,如图

从图中可以看出,在不使用Hadoop自定义数据类型的情况下, 需要根据情况将单词与文档名称拼接为一个key(如“MapReduce:file1.txt”) , 将词频作为一个value。
2、经过Map阶段数据转换后, 同一个文档中相同的单词会出现多个的情况, 而单纯依靠后续Reduce阶段无法同时完成词频统计和生成文档列表, 所以必须增加一个Combine阶段,先完成每一个文档的词频统计,如图

从图中可以看出,在Reduce阶段,根据前面的分析先完成每一个文档的词频统计,然后又对输入的<key,value>键值对进行了重新拆装, 将单词作为key,文档名称和词频组成一个value(如“file1.txt:1”) 。这是因为,如果直接将词频统计后的输出数据(如“MapReduce:file1.txt 1 ”) 作为下一阶段Reduce过程的输人, 那么在Shuffle过程时将面临一个问题:所有具有相同单词的记录应该交由同一个Reducer处理,但当前的key值无法保证这一点, 所以对key值和value值进行重新拆装。这样做的好处是可以利用MapReduce框架默认的HashPartitioner类完成Shuffle过程,将相同单词的所有记录发送给同一个Reducer进行处理。
3、经过上述两个阶段的处理后, Reduce阶段只需将所有文件中相同key值的value值进行统计,并组合成倒排索引文件所需的格式即可。

4、从上图可以看出,在Reduce阶段会根据所有文档中相同key进行统计,同时在处理过程中结合倒排索引文件的格式需求就可以生成对应的文件。

需要说明的是,创建倒排索引的最终目的是通过单词找到对应的文档,明确思路是Map Reduce程序编写的重点, 如果开发者在不了解人手阶段的Map数据格式如何设计时,不妨考虑从Reduce阶段输出的数据格式反向推导。

如果有什么问题可以联系我,或者在文章评论区留下你的问题或联系方式,一起交流解决! 谢谢观看此文章^_^  欢迎登录https://www.jile1422.top极乐的博客查看更多内容!

人已赞赏
Hadoop开发

深入浅出大数据:Hadoop的前世今生

2020-7-6 14:14:34

Hadoop开发

MapReduce经典案例——倒排索引(2)

2020-7-18 23:02:20

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索