先来简单介绍一下什么是文档倒排索引
倒排索引是文档检索系统中最常见的数据结构,被广泛应用在全文搜索引擎上。主要用来存储某个单词(或词组)在一个文档或者一组文档中的存储位置的映射,即提供了一种根据内容来查找文档的方式。
简单点来讲呢,就是根据内容找文章。
 
倒排索引的概念说明白了,就该说说怎么用MapReduce实现。
测试数据奉上:
file1:MapReduce is simple
file2:MapReduce is powerful is simple
file3:Hello MapReduce bye MapReduce 
输出的结果:
Hello    file3.txt:1;
MapReduce    file3.txt:2;file:2.txt:1;file1.txt:1;
bye    file"3.txt:1;
is    file2.txt:2;file1.txt:1; 
powerful    file2.txt:1;
simple    file2.txt:1;file1.txt:1;
 
设计思路
map、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
context.write("MapReduce:file1", 1)  context.write("is:file1", 1)  context.write("simple:file1", 1)  context.write("MapReduce :file2", 1)  context.write("is:file2", 1)  context.write("powerful :file2", 1) context.write("is:file2", 1) 
 
<"MapReduce:file1", {1}> <"is:file1", {1}> <"simple:file1", {1}>  <"simple:file1", {1}>  <"is:file2",  {1, 1}> ..........................
combine、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
context.write("MapReduce" , "file1:1") context.write("is" , "file1:1")  context.write("simple" , "file1:1")  context.write("MapReduce " , "file2:1")  context.write("is" , "file2:2")................................
<"MapReduce",{ "file1:1","file2:1"}>  <"is",{ "file1:1","file2:2"}>   <"simple",{ "file1:1"}> .......................
reduce、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
context.write("MapReduce","file1:1,file2:1")..................................
 
这个过程中的Combine是不可插拔的,也就是不可以省略的,因为它和Reduce的业务逻辑不一样。
 
代码奉上
import java.io.IOException;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.input.FileSplit;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat; public class InvertedIndex { public static class InvertedMap extends
Mapper<LongWritable, Text, Text, IntWritable> {
private Text kText = new Text();
private IntWritable vIntWritable = new IntWritable(1);
private FileSplit split; @Override
protected void map(LongWritable key, Text value, Context context)
throws IOException, InterruptedException {
String line = value.toString();
String[] lineSplit = line.split("\t");
// 获取文档名称
split = (FileSplit) context.getInputSplit();
int indexOfFile = split.getPath().toString().indexOf("file");
String fileName = split.getPath().toString().substring(indexOfFile); for (int i = 0; i < lineSplit.length; i++) {
kText.set(lineSplit[i] + ":" + fileName);
context.write(kText, vIntWritable);
} } } public static class InvertedConbine extends
Reducer<Text, IntWritable, Text, Text> {
private Text kText = new Text();
private Text vText = new Text(); protected void reduce(Text key, Iterable<IntWritable> values,
Context context) throws IOException, InterruptedException {
// 词频统计
int sum = 0;
for (IntWritable v : values) {
sum += v.get();
}
int indexOf = key.toString().indexOf(":");
kText.set(key.toString().substring(0, indexOf));
vText.set(key.toString().substring(indexOf + 1) + ":" + sum);
context.write(kText, vText); } } public static class InvertedReduce extends Reducer<Text, Text, Text, Text> {
private Text vText = new Text(); protected void reduce(Text key, Iterable<Text> values, Context context)
throws IOException, InterruptedException {
String filelist = new String();
for (Text v : values) {
filelist += v.toString() + ";";
}
vText.set(filelist);
context.write(key, vText);
} } public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException {
Configuration conf = new Configuration();
Job job = Job.getInstance(conf); job.setJarByClass(InvertedIndex.class); job.setMapperClass(InvertedMap.class);
job.setMapOutputKeyClass(Text.class);
job.setMapOutputValueClass(IntWritable.class); job.setCombinerClass(InvertedConbine.class); job.setReducerClass(InvertedReduce.class);
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(Text.class); FileInputFormat.setInputPaths(job, new Path(args[0]));
FileOutputFormat.setOutputPath(job, new Path(args[1])); System.exit(job.waitForCompletion(true)? 0:1);
} }
 

Hadoop-Map/Reduce实现实现倒排索引的更多相关文章

  1. Hadoop Map/Reduce教程

    原文地址:http://hadoop.apache.org/docs/r1.0.4/cn/mapred_tutorial.html 目的 先决条件 概述 输入与输出 例子:WordCount v1.0 ...

  2. 一步一步跟我学习hadoop(5)----hadoop Map/Reduce教程(2)

    Map/Reduce用户界面 本节为用户採用框架要面对的各个环节提供了具体的描写叙述,旨在与帮助用户对实现.配置和调优进行具体的设置.然而,开发时候还是要相应着API进行相关操作. 首先我们须要了解M ...

  3. Hadoop Map/Reduce

    Hadoop Map/Reduce是一个使用简易的软件框架,基于它写出来的应用程序能够运行在由上千个商用机器组成的大型集群上,并以一种可靠容错的方式并行处理上T级别的数据集.一个Map/Reduce ...

  4. Hadoop Map/Reduce 示例程序WordCount

    #进入hadoop安装目录 cd /usr/local/hadoop #创建示例文件:input #在里面输入以下内容: #Hello world, Bye world! vim input #在hd ...

  5. Hadoop Map/Reduce的工作流

    问题描述 我们的数据分析平台是单一的Map/Reduce过程,由于半年来不断地增加需求,导致了问题已经不是那么地简单,特别是在Reduce阶段,一些大对象会常驻内存.因此越来越顶不住压力了,当前内存问 ...

  6. (转载)Hadoop map reduce 过程获取环境变量

    来源:http://www.linuxidc.com/Linux/2012-07/66337.htm   作者: lmc_wy Hadoop任务执行过程中,在每一个map节点或者reduce节点能获取 ...

  7. Hadoop map reduce 任务数量优化

    mapred.tasktracker.map.tasks.maximum 官方解释:The maximum number of map tasks that will be run  simultan ...

  8. hadoop2.2编程:自定义hadoop map/reduce输入文件切割InputFormat

    hadoop会对原始输入文件进行文件切割,然后把每个split传入mapper程序中进行处理,FileInputFormat是所有以文件作为数据源的InputFormat实现的基类,FileInput ...

  9. hadoop map reduce 实例wordcount的使用

    hadoop jar hadoop-mapreduce-examples-2.7.3.jar wordcount /wordcount.txt /wc/output3

  10. Hadoop学习:Map/Reduce初探与小Demo实现

    原文地址:https://blog.csdn.net/liyong199012/article/details/25423221 一.    概念知识介绍 Hadoop MapReduce是一个用于处 ...

随机推荐

  1. 喵星人教你记 HTTP 状态码

    记忆HTTP状态码是有一些困难的,因为状态码很多且很难记忆.GirlieMac,也就是Tomomi Imura利用她巧妙的构思,PS了一系列的HTTP状态信息.在你看过这些图片之后,你绝对可以记住一些 ...

  2. Haxe - Actuate.Tween

    方法解释: Actuate.tween( target : Dynamic , duration : Float , properties : Dynamic , ?overwrite : Bool ...

  3. 图像二值化----otsu(最大类间方差法、大津算法)

    最大类间方差法是由日本学者大津于1979年提出的,是一种自适应的阈值确定的方法,又叫大津 法,简称OTSU.它是按图像的灰度特性,将图像分成背景和目标2部分.背景和目标之间的类间方差越大,说明构成图像 ...

  4. 选择语句----switch case

    今天学习了选择语句的 switch case是多选一的情况可以使用. 案例: //分别输入月份 几号 输出是今年的多少天 //每年的1,3,5,7,8,10,12月是31天 //今年的2月是28天 其 ...

  5. 用git difff 生成补丁

    http://stackoverflow.com/questions/1191282/how-to-see-the-changes-between-two-commits-without-commit ...

  6. mac 下php运行bug

    如下所说bug在window下没有,在mac下存在. mac下的php报如下错误: fopen("data.json") Error: failed to open stream: ...

  7. 使用easyui实现列表的批量删除

    使用easyui实现列表的批量删除 首先要做的就是增加一个多选框 <table id="otGrid" nowrap="false" style=&quo ...

  8. poj 1699 Best Sequence (搜索技巧 剪枝 dfs)

    题目链接 题意:给出几个基因片段,要求你将它们排列成一个最短的序列,序列中使用了所有的基因片段,而且不能翻转基因. 分析:先计算出add数组,再dfs枚举. 空间复杂度O(n*n),  最坏时间复杂度 ...

  9. ACM - ICPC World Finals 2013 A Self-Assembly

    原题下载 : http://icpc.baylor.edu/download/worldfinals/problems/icpc2013.pdf 这道题其实是2013年我AC的第一道题,非常的开心,这 ...

  10. 函数rec_init_offsets

    http://database.51cto.com/art/201303/383042.htm /*************************************************** ...