hadoop1.2.1 MultipleOutputs将结果输出到多个文件或文件夹
hadoop1.2.1中使用MultipleOutputs将结果输出到多个文件或文件夹
使用步骤主要有三步:
1、在reduce或map类中创建MultipleOutputs对象,将结果输出
- class reduceStatistics extends Reducer<Text, IntWritable, Text, IntWritable>{
- //将结果输出到多个文件或多个文件夹
- private MultipleOutputs<Text,IntWritable> mos;
- //创建对象
- protected void setup(Context context) throws IOException,InterruptedException {
- mos = new MultipleOutputs<Text, IntWritable>(context);
- }
- //关闭对象
- protected void cleanup(Context context) throws IOException,InterruptedException {
- mos.close();
- }
- }
2、在map或reduce方法中使用MultipleOutputs对象输出数据,代替congtext.write()
- protected void reduce(Text key, Iterable<IntWritable> values, Context context)
- throws IOException, InterruptedException {
- IntWritable V = new IntWritable();
- int sum = 0;
- for(IntWritable value : values){
- sum = sum + value.get();
- }
- System.out.println("word:" + key.toString() + " sum = " + sum);
- V.set(sum);
- //使用MultipleOutputs对象输出数据
- if(key.toString().equals("hello")){
- mos.write("hello", key, V);
- }else if(key.toString().equals("world")){
- mos.write("world", key, V);
- }else if(key.toString().equals("hadoop")){
- //输出到hadoop/hadoopfile-r-00000文件
- mos.write("hadoopfile", key, V, "hadoop/");
- }
- }
3、在创建job时,定义附加的输出文件,这里的文件名称与第二步设置的文件名相同
- //定义附加的输出文件
- MultipleOutputs.addNamedOutput(job,"hello",TextOutputFormat.class,Text.class,IntWritable.class);
- MultipleOutputs.addNamedOutput(job,"world",TextOutputFormat.class,Text.class,IntWritable.class);
- MultipleOutputs.addNamedOutput(job,"hadoopfile",TextOutputFormat.class,Text.class,IntWritable.class);
完整代码:
- package com.ru.hadoop.wordcount;
- import java.io.IOException;
- import java.net.URI;
- import java.net.URISyntaxException;
- import java.util.regex.Pattern;
- import org.apache.hadoop.conf.Configuration;
- import org.apache.hadoop.conf.Configured;
- import org.apache.hadoop.fs.FileSystem;
- import org.apache.hadoop.fs.Path;
- import org.apache.hadoop.io.IntWritable;
- import org.apache.hadoop.io.LongWritable;
- import org.apache.hadoop.io.NullWritable;
- import org.apache.hadoop.io.Text;
- import org.apache.hadoop.mapred.JobConf;
- import org.apache.hadoop.mapred.RecordWriter;
- import org.apache.hadoop.mapred.lib.MultipleOutputFormat;
- import org.apache.hadoop.mapred.lib.MultipleTextOutputFormat;
- 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;
- import org.apache.hadoop.mapreduce.lib.output.MultipleOutputs;
- import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;
- import org.apache.hadoop.util.Progressable;
- public class WordCount2 extends Configured{
- public static void main(String[] args) {
- String in = "/home/nange/work/test/word/";
- String out = "hdfs://localhost:9000/hdfs/test/wordcount/out/";
- Job job;
- try {
- //删除hdfs目录
- WordCount2 wc2 = new WordCount2();
- wc2.removeDir(out);
- job = new Job(new Configuration(), "wordcount Job");
- job.setOutputKeyClass(Text.class);
- job.setOutputValueClass(IntWritable.class);
- job.setMapperClass(mapperString.class);
- // job.setCombinerClass(reduceStatistics.class);
- job.setReducerClass(reduceStatistics.class);
- //定义附加的输出文件
- MultipleOutputs.addNamedOutput(job,"hello",TextOutputFormat.class,Text.class,IntWritable.class);
- MultipleOutputs.addNamedOutput(job,"world",TextOutputFormat.class,Text.class,IntWritable.class);
- MultipleOutputs.addNamedOutput(job,"hadoopfile",TextOutputFormat.class,Text.class,IntWritable.class);
- FileInputFormat.addInputPath(job, new Path(in));
- FileOutputFormat.setOutputPath(job, new Path(out));
- job.waitForCompletion(true);
- } catch (IOException e) {
- e.printStackTrace();
- } catch (URISyntaxException e) {
- e.printStackTrace();
- } catch (ClassNotFoundException e) {
- e.printStackTrace();
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
- public void removeDir(String filePath) throws IOException, URISyntaxException{
- String url = "hdfs://localhost:9000";
- FileSystem fs = FileSystem.get(new URI(url), new Configuration());
- fs.delete(new Path(filePath));
- }
- }
- /**
- * 重写maptask使用的map方法
- * @author nange
- *
- */
- class mapperString extends Mapper<LongWritable, Text, Text, IntWritable>{
- //设置正则表达式的编译表达形式
- public static Pattern PATTERN = Pattern.compile(" ");
- Text K = new Text();
- IntWritable V = new IntWritable(1);
- @Override
- protected void map(LongWritable key, Text value, Context context)
- throws IOException, InterruptedException {
- String[] words = PATTERN.split(value.toString());
- System.out.println("********" + value.toString());
- for(String word : words){
- K.set(word);
- context.write(K, V);
- }
- }
- }
- /**
- * 对单词做统计
- * @author nange
- *
- */
- class reduceStatistics extends Reducer<Text, IntWritable, Text, IntWritable>{
- //将结果输出到多个文件或多个文件夹
- private MultipleOutputs<Text,IntWritable> mos;
- //创建MultipleOutputs对象
- protected void setup(Context context) throws IOException,InterruptedException {
- mos = new MultipleOutputs<Text, IntWritable>(context);
- }
- @Override
- protected void reduce(Text key, Iterable<IntWritable> values, Context context)
- throws IOException, InterruptedException {
- IntWritable V = new IntWritable();
- int sum = 0;
- for(IntWritable value : values){
- sum = sum + value.get();
- }
- System.out.println("word:" + key.toString() + " sum = " + sum);
- V.set(sum);
- //使用MultipleOutputs对象输出数据
- if(key.toString().equals("hello")){
- mos.write("hello", key, V);
- }else if(key.toString().equals("world")){
- mos.write("world", key, V);
- }else if(key.toString().equals("hadoop")){
- //输出到hadoop/hadoopfile-r-00000文件
- mos.write("hadoopfile", key, V, "hadoop/");
- }
- }
- //关闭MultipleOutputs对象
- protected void cleanup(Context context) throws IOException,InterruptedException {
- mos.close();
- }
- }
hadoop1.2.1 MultipleOutputs将结果输出到多个文件或文件夹的更多相关文章
- java 写一个"HelloJavaWorld你好世界"输出到操作系统文件Hello.txt文件中
package com.beiwo.homework; import java.io.File; import java.io.FileOutputStream; import java.io.IOE ...
- Java递归输出指定路径下所有文件及文件夹
package a.ab; import java.io.File; import java.io.IOException; public class AE { public static void ...
- Java基础知识强化之IO流笔记14:递归之输出指定目录下所有java文件绝对路径的案例
1. 需求:输出指定目录下的所以.java结尾文件的绝对路径的案例: 分析: A:封装目录 B:获取该目录下的所有文件和文件夹的File数组 C:遍历这个File数组,得到每一个File对象的 ...
- php遍历目录输出目录及其下的所有图片文件
在做网站的时候,需要给文章内所有的图片添加上logo,如何利用ThinkPHP来实现. ThinkPHP为我们很好的提供了图像处理类,给文章中的所有图片加上水印的思路,上传的图片文件都保存在一个文件夹 ...
- 将Maple输出的LaTex导出到txt文件
将Maple输出的LaTex导出到txt文件 1. 生成LATEX Maple可以把它的表达式转换成LATEX, 使用latex命令即可: > latex(x^2+y^2=z^2); {x}^{ ...
- Python小代码_15_遍历指定路径下的所有文件和文件夹,并格式化输出文件路径文件名和文件夹名,文件大小,修改时间
遍历指定路径下的所有文件和文件夹,并格式化输出文件路径文件名和文件夹名,文件大小,修改时间 import osimport datetime def print_tree(dir_path): for ...
- java代码实现输出指定以.java结尾的文件的绝对路径
package 输出指定文件绝对路径; import java.io.File; /* * 需求:请大家把"E:\\JAVA语言"文件夹下全部的java结尾的文件的绝对路径给输出在 ...
- 如何在屏幕上查看命令的输出以及在Linux中写入文件
在Linux中输出命令可以做很多事情(http://www.nanke0834.com) 您可以将命令的输出分配给变量,将其发送到另一个命令/程序以通过管道进行处理或将其重定向到文件以进行进一步分析. ...
- Linux命令nohup实现命令后台运行并输出到或记录到日志文件
Linux命令nohup实现命令后台运行并输出到或记录到日志文件 导读 我们在调试程序的时候,免不了要去抓一些 log ,然后进行分析.如果 log 量不是很大的话,那很简单,只需简单的复制粘贴就好. ...
随机推荐
- VBS基础篇 - VBScript过程
VBS基础篇 - VBScript过程 在 VBScript 中,过程被分为两类:Sub 过程和 Function 过程. Sub过程 Sub 过程是包含在 Sub 和 End Sub 语句之间的 ...
- leetcode441(巧妙利用取整和解方程)
You have a total of n coins that you want to form in a staircase shape, where every k-th row must ha ...
- MVC 数据绑定
在做Asp.Net MVC项目中,都知道View负责页面展示数据或者提供页面收集数据,而所展示的数据或者收集的数据都是从Controller的Action中获取或提交到Controller的Actio ...
- R语言笔记5--读数据
1.读文本文件数据 (1)先设置工作目录,把文本文件放于该目录下 备注:在记事本里写完数据后,按一下回车,负责在R语言中出现错误 (2)读剪贴板 文本或EXCEL的数据均可通过剪贴板操作 (3)读ex ...
- asp.net textbox控件readonly为true时,后台取值的问题
如题,在后台通过textbox.Text方式取值为空,不论你默认值是否是空,如想要获得,需通过request.Form[""]的方式.
- Smoke Testing(冒烟测试)
Smoke Testing 的概念最早源于制造业,用于测试管道.测试时,用鼓风机往管道里灌烟,看管壁外面是否有烟冒出来,以便检验管道是否有缝隙.这一测试显然比较初级,更深层一点的测试至少要进行渗油测试 ...
- android下m、mm、mmm编译命令的使用
android下m.mm.mmm编译命令的使用 通过查看android源码目录下的build/envsetup.sh文件,可知: - m: Makes from the top of th ...
- elasticsearch 性能调优
所有的修改都可以在elasticsearch.yml里面修改,也可以通过api来修改.推荐用api比较灵活 1.不同分片之间的数据同步是一个很大的花费,默认是1s同步,如果我们不要求实时性,我们可以执 ...
- unity中的update、Lateupdate和FixedUpdate。
MonoBehaviour.Update 更新 当MonoBehaviour启用时,其Update在每一帧被调用. MonoBehaviour.FixedUpdate 固定更新 当MonoBehavi ...
- Win7下配置Django+Apache+mod_wsgi+Sqlite
搭建环境: win7 64位 Django 1.8.5 Apache2.4.17 mod_wsgi_ap24py27.so Python2.7.9 1 安装Apache 下载Apache Haus版, ...