十二:对文件内容索引练习例子

需求:

对文件中的内容进行索引,并且显示出对文件内容索引以及所在文件名称:

a.txt
hello tom
hello jerry
hello tom

b.txt
hello jerry
hello jerry
tom jerry

c.txt
hello jerry
hello tom

最终输出结果:

hello   a.txt-->3  b.txt-->2  c.txt -->2
jerry	  a.txt-->1  b.txt-->3  c.txt -->1
tom     a.txt-->2  b.txt-->1  c.txt -->1

代码实现:

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 InverseIndexStepOne {

	static class InverseIndexStepOneMapper extends Mapper<LongWritable, Text, Text, IntWritable> {

		@Override
		protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {

			String line = value.toString();

			String[] words = line.split(" ");

			// 因为map方法是由maptask来调用的,而maptask知道自己所读的数据所在的切片
			// 进而,在切片信息中有切片所属的文件信息
			FileSplit inputSplit = (FileSplit) context.getInputSplit();
			String fileName = inputSplit.getPath().getName();

			for (String word : words) {
				context.write(new Text(word + "-->" + fileName), new IntWritable(1));

			}

		}

	}

	static class InverseIndexStepOneReducer extends Reducer<Text, IntWritable, Text, LongWritable> {

		@Override
		protected void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {
			long count = 0;
			for (IntWritable value : values) {
				count += value.get();

			}
			context.write(key, new LongWritable(count));
		}
	}

	public static void main(String[] args) throws Exception {

		Configuration conf = new Configuration();

		Job job = Job.getInstance(conf);

		job.setJarByClass(InverseIndexStepOne.class);

		job.setMapperClass(InverseIndexStepOneMapper.class);
		job.setReducerClass(InverseIndexStepOneReducer.class);

		job.setMapOutputKeyClass(Text.class);
		job.setMapOutputValueClass(IntWritable.class);

		job.setOutputKeyClass(Text.class);
		job.setOutputValueClass(LongWritable.class);

		/**
		 * hadoop中默认的输入输出组件就是TextInputformat和textoutputformat,所以,这两句代码也可以省略
		 */
		/*
		 * job.setInputFormatClass(TextInputFormat.class);
		 * job.setOutputFormatClass(TextOutputFormat.class);
		 */

		FileInputFormat.setInputPaths(job, new Path(args[0]));
		FileOutputFormat.setOutputPath(job, new Path(args[1]));

		boolean res = job.waitForCompletion(true);
		System.exit(res ? 0 : 1);
	}
}

输出结果为:

但是这样结果并不是我们想要的,所以在这个文件基础上需要在写一个Mapreduce程序来达到我们想要的结果

代码实现:

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.output.FileOutputFormat;

/**
 * 是基于上一个步骤的结果来进行处理
 * 
 * hello-->a.txt 3 hello-->b.txt 2 hello-->c.txt 2 jerry-->a.txt 1 jerry-->b.txt
 * 3 jerry-->c.txt 1 tom-->a.txt 2 tom-->b.txt 1 tom-->c.txt 1
 * 
 * @author
 * 
 */
public class InverseIndexStepTwo {

	static class InverseIndexStepTwoMapper extends Mapper<LongWritable, Text, Text, Text> {

		@Override
		protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {

			String line = value.toString();

			String[] split = line.split("\t");
			String[] wordAndFile = split[0].split("-->");

			String count = split[1];
			String word = wordAndFile[0];
			String fileName = wordAndFile[1];

			context.write(new Text(word), new Text(fileName + "-->" + count))
		}

	}

	static class InverseIndexStepTwoReducer extends Reducer<Text, Text, Text, Text> {

		// 输入:<hello,a.txt-->3><hello,b.txt-->2><hello,c.txt-->1>
		// 输出: hello a.txt-->3 b.txt-->2 c.txt -->2
		@Override
		protected void reduce(Text key, Iterable<Text> values, Context context) throws IOException, InterruptedException {

			StringBuffer sb = new StringBuffer();

			for (Text value : values) {

				sb.append(value.toString()).append(" ");

			}

			context.write(key, new Text(sb.toString()));

		}

	}
	public static void main(String[] args) throws Exception {

		Configuration conf = new Configuration();

		Job job = Job.getInstance(conf);

		job.setJarByClass(InverseIndexStepTwo.class);

		job.setMapperClass(InverseIndexStepTwoMapper.class);
		job.setReducerClass(InverseIndexStepTwoReducer.class);

		job.setMapOutputKeyClass(Text.class);
		job.setMapOutputValueClass(Text.class);

		job.setOutputKeyClass(Text.class);
		job.setOutputValueClass(Text.class);

		/**
		 * hadoop中默认的输入输出组件就是TextInputformat和textoutputformat,所以,这两句代码也可以省略
		 */
		/*
		 * job.setInputFormatClass(TextInputFormat.class);
		 * job.setOutputFormatClass(TextOutputFormat.class);
		 */

		FileInputFormat.setInputPaths(job, new Path(args[0]));
		FileOutputFormat.setOutputPath(job, new Path(args[1]));

		boolean res = job.waitForCompletion(true);
		System.exit(res ? 0 : 1);
	}
}
时间: 2024-10-14 02:17:12

十二:对文件内容索引练习例子的相关文章

C语言第十二讲,文件操作.

C语言第十二讲,文件操作. 一丶文件操作概述 在操作系统中,我们的文档都称为文件.操作系统也为我们提供了接口进行操作.不同语言都是使用的相同的接口,只不过封装的上层接口不一样 操作文件的步骤 打开文件->读写文件->关闭文件. 二丶文件流的概述. 文件流称为 输入流和输出流.  其实就是从内存写数据到磁盘.和从磁盘读数据到内存. 内存->磁盘  称为输出流. 输出到磁盘 磁盘->内存 称为输入流.读取到内存. 三丶文件的打开和关闭. 1.操作原型. FILE *fopen(char

7 RandomAccessFile读取文件内容保存--简单例子(需要验证)

1 import org.slf4j.Logger; 2 import org.slf4j.LoggerFactory; 3 4 import java.io.*; 5 6 /** 7 * 读取动态产生的文件内容 8 */ 9 public class RandomAccessRead { 10 public static Logger logger= LoggerFactory.getLogger(RandomAccessRead.class); 11 12 //文件默认读取位置为从开始读取

云计算设计模式(二十二)——静态内容托管模式

部署静态内容到一个基于云的存储服务,可以直接向客户提供这些.这个模式可以减少潜在的昂贵的计算实例的需求. 景和问题 Web应用程序通常包括静态内容的一些元素.此静态内容可以包括HTML页面和诸如图像和可用到客户端的文件的其他资源,无论是作为一个HTML页的一部分(如嵌入式图像,样式表和客户端JavaScript文件)或作为单独的下载(如PDF文档). 尽管Web服务器以及调整通过有效的动态执行页代码和输出缓存优化的要求,他们仍然必须处理请求下载静态内容.这种吸收,可以经常得到更好的利用处理周期.

python练习六十二:文件处理,往文件中所有添加指定的前缀

往文件中所有添加指定的前缀 方法一:open方法 f_r = open('text.txt') f_w = open('text_new.txt','w+') i = 0 while True: i += 1 line = f_r.readline() if not line: break f_w.write('%02d'%i + '.python'+ ' ' +line) f_r.close() f_w.close() f_wr = open('text_new.txt','r') lines

shell(十二)选取部分内容

cut可以按规则选取部分内容 例1 :选取用户名对应的id号及家目录. 命令中的-d选项指定分隔符,-f先项指定分隔后的片段号 cat /etc/passwd | cut -d ':' -f 1,3,6 例2. 以字符为单位,指定输出片段 cut -c ... 上例中的“1-7”和“12-”分别指定片段的范围

Python 3.5(十二)文件操作

注意: read() python3按照字符读取 tell()    python3按照字节来读取 seek() 设置文件当前位置 truncate([size#截取位置]) 从文件的首行首字符开始截断,截断文件为 size 个字符,无 size 表示从当前位置截断:截断之后 V 后面的所有字符被删除,其中 Widnows 系统下的换行代表2个字符大小.

Python基础学习笔记(十二:文件基本操作)

《构建之法》第十一、十二章学习总结

第十一章的内容是软件设计与实现. 在第一节中,讲的是关于分析和设计方法,向我们介绍在"需求分析"."设计与实现"阶段."测试""发布"阶段该搞清楚的问题. 在第二节中,讲的是关于图形建模和分析方法.在表达实体和实体之间的关系时,可以用到思维导图(Mind Map).实体关系图(ERD).UCD ;在表达数据的流动时,可以用到DFD工具:在表达控制流的时候可以用到FSM工具:前面提到的这些图形建模方法各有特点,UML却可以有一个

python之查询员工名单(读取文件,查询文件内容)

存储员工信息的文件 一.打开文件 1:打开文件contact_list.txt 2:在内存中的地址 二.读取文件内容 三.C.按Tab键可以看到有什么功能,从而找到C.readline()方法,执行一下这个方法,执行以下,一次往下读取一行 Tips:不带条件的一直读取,一直读取whileTrue: