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 量不是很大的话,那很简单,只需简单的复制粘贴就好. ...
随机推荐
- μCos-ii学习笔记2_任务管理
二.任务管理 任务管理是ucos-ii操作系统的核心内容.这一章大致就以下流程来介绍和总结任务管理的相关知识. 要实现复杂任务管理,必然要定义众多数据来描述任务状态,为了精简,建立了许多不同的数据结构 ...
- c语言-何为编程?
大牛,请绕过. 新手,如果你怕我误人子弟,那也请绕过. 以下纯属个人YY 何为编程?何为程序? 说简单也简单,说复杂也复杂. 我在自学的道路上也有两三年了,也探索了两三年(非连续性),却只停留在入门阶 ...
- VNC VIEWER的使用集锦
关于颜色深度的问题, 今天用VNC Viewser ,连上去之后,发现色彩可能只有8或者16位 然后修改了 sever的depth,也不好使, 于是,就修改了 client的 colourlevel ...
- inflate的使用注意事项
public View inflate (int resource, ViewGroup root, boolean attachToRoot) 我们在使用这个方法时,要清楚原理,下面是这个方法的文档 ...
- LeetCode OJ 217.Contains Duplicate
Given an array of integers, find if the array contains any duplicates. Your function should return t ...
- Hunters
Hunters Time Limit : 2000/1000ms (Java/Other) Memory Limit : 32768/32768K (Java/Other) Total Submi ...
- chrome 常用快捷操作
Chrome窗口和标签页快捷键: Ctrl+N 打开新窗口 Ctrl+T 打开新标签页 Ctrl+Shift+N 在隐身模式下打开新窗口 Ctrl+O,然后选择文件,在谷歌浏览器中打开计算机上的文件 ...
- CentOS 7 时区设置
设置时区同样, 在 CentOS 7 中, 引入了一个叫 timedatectl 的设置设置程序. 用法很简单: # timedatectl # 查看系统时间方面的各种状态 $timedatectl ...
- Hololens 开发环境配置
安装 Hololens SDK 转自 Vangos Pterneas, 4 Apr 2016 CPOL 5.00 (1 vote) vote 1vote 2vote 3vote 4vote 5 ...
- 四维dp 或者 剪枝 + dfs Codeforces Beta Round #6 (Div. 2 Only) D
http://codeforces.com/contest/6/problem/D 题目大意:有一队人,排成一列,每个人都有生命值,你每次可以攻击2~n位置的一个的人,假设每次攻击的位置为pos,那么 ...