先来简单介绍一下什么是文档倒排索引
倒排索引是文档检索系统中最常见的数据结构,被广泛应用在全文搜索引擎上。主要用来存储某个单词(或词组)在一个文档或者一组文档中的存储位置的映射,即提供了一种根据内容来查找文档的方式。
简单点来讲呢,就是根据内容找文章。
 
倒排索引的概念说明白了,就该说说怎么用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. MSSQL2005数据库自动备份问题(到同一个局域网上的另一台电脑上)

    有A数据库服务器,B本机:    我现在想通过在B机器上通过代码调用SQL来执行A数据库的备份到B机器上    调用的SQL语句为:Backup Database MYDATABASE To Disk ...

  2. rhel-server-7.2-x86_64无法联网(VMware环境)

    vim /etc/sysconfig/network-script vim ifcfg-eno16777736 (编辑网卡名) 将ONBOOT=NO更改为YES (启动network服务时是否启用该网 ...

  3. spring-boot-quartz, 依赖spring-boot-parent

    spring-boot-quartz, 依赖spring-boot-parent spring-boot Easyui Quartz 项目启动后输入:http://localhost/ 数据库文件:  ...

  4. Mmap的实现原理和应用

    http://blog.csdn.net/edwardlulinux/article/details/8604400 很多文章分析了mmap的实现原理.从代码的逻辑来分析,总是觉没有把mmap后读写映 ...

  5. struct inode 和 struct file

    1.struct inode──字符设备驱动相关的重要结构介绍 内核中用inode结构表示具体的文件,而用file结构表示打开的文件描述符.Linux2.6.27内核中,inode结构体具体定义如下: ...

  6. RecyclerView(5)官方教程带简单示例

    Create Lists The RecyclerView widget is a more advanced and flexible version of ListView. This widge ...

  7. java中List的排序功能的实现

    今天在工作的时候,遇到了List排序的问题,所以总结了一下,与大家分享.Collections.sort排序的时候,用到了Comparator接口下面的compare()方法.下面的小例子中,还用到了 ...

  8. OOD、OOP、AOP区别

    OOD:面向对象设计(Object-Oriented Design,OOD)方法是OO方法中一个中间过渡环节.其主要作用是对OOA分析的结果作进一步的规范化整理,以便能够被OOP直接接受. OOP:面 ...

  9. EF4.0和EF5.0增删改查写法区别

    1 public T AddEntity(T entity) 2 { 3 //EF4.0的写法 4 添加实体 5 //db.CreateObjectSet<T>().AddObject(e ...

  10. [反汇编练习] 160个CrackMe之017

    [反汇编练习] 160个CrackMe之017. 本系列文章的目的是从一个没有任何经验的新手的角度(其实就是我自己),一步步尝试将160个CrackMe全部破解,如果可以,通过任何方式写出一个类似于注 ...