关于Hadoop的安装以及实验一可以参考:
下面来看实验二:文档倒排索引算法实现
(debug的过程还是挺艰辛的)实验内容包括:(1)去除stop-words (2)统计单词在每篇文档中出现的频率
一开始的思路我是参考的Hadoop之倒排索引,感觉挺好的,但是做到后面发现有问题。
还是从头开始吧。
(1)首先是处理停用词表
利用MapReduce的分布式缓存
1 | //添加停用词表 |
在一开始进行处理,所以在map函数中通过context来访问到缓存的文件,重写setup方法来进行初始化 。setup方法用于初始化,只会执行一次。将停用词表的每一个词读出存入set中。(感觉在reduce的setup方法中处理也可以)
1 | private Set<String> stopwords = new TreeSet<String>(); |
(2)分析MapReduce的输入、输出对。
按照之前链接上的思路,与给的标准答案对比,会出现txt排序不正确的问题,因为MapReduce的默认排序是对key。因此必须将txt也作为reduce输入key的一部分。
map类:输入对<offset, line>,输出对 < key txt, 1 >
tips:中间分隔符应该用ASCII表排在数字之前的符号,否则单个数字就会被排到后面去
1 | //<offset,line>--><word:txt,1> |
为了方便后面的计算频数,在map和reduce之间添加一个combine类,先将一个词在同一个txt的出现次数加起来。
1 | public static class Combine extends Reducer<Text, IntWritable, Text, IntWritable>{ |
因为当前key为word txt,为了将同一个word分到一个reduce上,需要自定义partioner类。
1 | //所以为了将按word分到一起... |
最后的reduce类:输入
1 | public static class Reduce extends Reducer<Text, IntWritable, Text, Text> { |
在main方法中,要注意设置的map和reduce的输出和前面写的一样,否则会报错,(╥╯^╰╥)
还要注意的是上一个输出对和下一个输入对类型要一致,否则会报错。
由此,实验二结束,✿✿ヽ(°▽°)ノ✿