用户在使用Mapreduce时默认以part-*命名,

MultipleOutputs能够将不同的键值对输出到用户自己定义的不同的文件里。

实现过程是在调用output.write(key, new IntWritable(total), key.toString());

方法时候第三个參数是  public void write(KEYOUT key, VALUEOUT value, String baseOutputPath) 指定了输出文件的命名前缀。那么我们能够通过对不同的key使用不同的baseOutputPath来使不同key相应的value输出到不同的文件里,比方将同一天的数据输出到以该日期命名的文件里

測试数据:ip-to-hosts.txt

  1. 18.217.167.70 United States
  2. 206.96.54.107 United States
  3. 196.109.151.139 Mauritius
  4. 174.52.58.113 United States
  5. 142.111.216.8 Canada
  6. 162.100.49.185 United States
  7. 146.38.26.54 United States
  8. 36.35.107.36 China
  9. 95.214.95.13 Spain
  10. 2.96.191.111 United Kingdom
  11. 62.177.119.177 Czech Republic
  12. 21.165.189.3 United States
  13. 46.190.32.115 Greece
  14. 113.173.113.29 Vietnam
  15. 42.65.172.142 Taiwan
  16. 197.91.198.199 South Africa
  17. 68.165.71.27 United States
  18. 110.119.165.104 China
  19. 171.50.76.89 India
  20. 171.207.52.113 Singapore
  21. 40.174.30.170 United States
  22. 191.170.95.175 United States
  23. 17.81.129.101 United States
  24. 91.212.157.202 France
  25. 173.83.82.99 United States
  26. 129.75.56.220 United States
  27. 149.25.104.198 United States
  28. 103.110.22.19 Indonesia
  29. 204.188.117.122 United States
  30. 138.23.10.72 United States
  31. 172.50.15.32 United States
  32. 85.88.38.58 Belgium
  33. 49.15.14.6 India
  34. 19.84.175.5 United States
  35. 50.158.140.215 United States
  36. 161.114.120.34 United States
  37. 118.211.174.52 Australia
  38. 220.98.113.71 Japan
  39. 182.101.16.171 China
  40. 25.45.75.194 United Kingdom
  41. 168.16.162.99 United States
  42. 155.60.219.154 Australia
  43. 26.216.17.198 United States
  44. 68.34.157.157 United States
  45. 89.176.196.28 Czech Republic
  46. 173.11.51.134 United States
  47. 116.207.191.159 China
  48. 164.210.124.152 United States
  49. 168.17.158.38 United States
  50. 174.24.173.11 United States
  51. 143.64.173.176 United States
  52. 160.164.158.125 Italy
  53. 15.111.128.4 United States
  54. 22.71.176.163 United States
  55. 105.57.100.182 Morocco
  56. 111.147.83.42 China
  57. 137.157.65.89 Australia

该文件里每行数据有两个字段 各自是ip地址和该ip地址相应的国家。以\t分隔

上代码

  1. public static class IPCountryReducer
  2. extends Reducer<Text, IntWritable, Text, IntWritable> {
  3.  
  4. private MultipleOutputs output;
  5.  
  6. @Override
  7. protected void setup(Context context
  8. ) throws IOException, InterruptedException {
  9. output = new MultipleOutputs(context);
  10. }
  11.  
  12. @Override
  13. protected void reduce(Text key, Iterable<IntWritable> values, Context context
  14. ) throws IOException, InterruptedException {
  15. int total = 0;
  16. for(IntWritable value: values) {
  17. total += value.get();
  18. }
  19. <span style="color:#FF0000;"> output.write(new Text("Output by MultipleOutputs"), NullWritable.get(), key.toString());
  20. output.write(key, new IntWritable(total), key.toString());</span>
  21.  
  22. }
  23.  
  24. @Override
  25. protected void cleanup(Context context
  26. ) throws IOException, InterruptedException {
  27. output.close();
  28. }
  29. }

在reduce的setup方法中

  1. output = new MultipleOutputs(context);

然后在reduce中通过该output将内容输出到不同的文件里

  1. private Configuration conf;
  2. public static final String NAME = "named_output";
  3.  
  4. public static void main(String[] args) throws Exception {
  5. args =new String[] {"hdfs://caozw:9100/user/hadoop/hadooprealword","hdfs://caozw:9100/user/hadoop/hadooprealword/output"};
  6. ToolRunner.run(new Configuration(), new NamedCountryOutputJob(), args);
  7. }
  8.  
  9. public int run(String[] args) throws Exception {
  10. if(args.length != 2) {
  11. System.err.println("Usage: named_output <input> <output>");
  12. System.exit(1);
  13. }
  14.  
  15. Job job = new Job(conf, "IP count by country to named files");
  16. job.setInputFormatClass(TextInputFormat.class);
  17.  
  18. job.setMapperClass(IPCountryMapper.class);
  19. job.setReducerClass(IPCountryReducer.class);
  20.  
  21. job.setMapOutputKeyClass(Text.class);
  22. job.setMapOutputValueClass(IntWritable.class);
  23. job.setJarByClass(NamedCountryOutputJob.class);
  24.  
  25. FileInputFormat.addInputPath(job, new Path(args[0]));
  26. FileOutputFormat.setOutputPath(job, new Path(args[1]));
  27.  
  28. return job.waitForCompletion(true) ? 1 : 0;
  29.  
  30. }
  31.  
  32. public void setConf(Configuration conf) {
  33. this.conf = conf;
  34. }
  35.  
  36. public Configuration getConf() {
  37. return conf;
  38. }
  39.  
  40. public static class IPCountryMapper
  41. extends Mapper<LongWritable, Text, Text, IntWritable> {
  42.  
  43. private static final int country_pos = 1;
  44. private static final Pattern pattern = Pattern.compile("\\t");
  45.  
  46. @Override
  47. protected void map(LongWritable key, Text value,
  48. Context context) throws IOException, InterruptedException {
  49. String country = pattern.split(value.toString())[country_pos];
  50. context.write(new Text(country), new IntWritable(1));
  51. }
  52. }

測试结果:

在Maprecue中利用MultipleOutputs输出多个文件的更多相关文章

  1. 将Matlab中的矩阵输出到txt文件

    将矩阵输出到txt文件中的方法,遍寻网络,始见真经!!! fid=fopen('C:Documents and Settingscleantotal.ped','wt');%写入文件路径 matrix ...

  2. Unity3D题目,Unity中利用GUI输出九九乘法表

    网上看到的这题,下面贴出源代码 using UnityEngine;using System.Collections; public class c99 : MonoBehaviour//C#脚本名: ...

  3. PHP中利用PCLZIP压缩解压文件

    <?php include_once('pclzip.lib.php'); $archive = new PclZip('archive.zip'); /* $v_list = $archive ...

  4. Linux中利用grep命令如何检索文件内容详解

    前言 Linux系统中搜索.查找文件中的内容,一般最常用的是grep命令,另外还有egrep命令,同时vi命令也支持文件内容检索.下面来一起看看Linux利用grep命令检索文件内容的详细介绍. 方法 ...

  5. hdf 5文件格式及python中利用h5py模块读写h5文件

    h5文件格式,HDF 的版本 5(HDF 版本 5不与 HDF 版本 4 及早期版本兼容).HDF是什么呢?就是Hierarchical Data Format,可以存储不同类型的图像和数码数据的文件 ...

  6. 小白向:web中利用request.getPart()上传文件到服务器

    被文件上传弄得焦头烂额的一天,果然web中的路径和各种设置真的好讨厌= = 下面是超级小白的.及其简约的“详”解 1.明确目的: 用户将 1.txt 文件 上传到 服务器(web工程下的某个文件夹)中 ...

  7. 在asp.net web api中利用过滤器设置输出缓存

    介绍 本文将介绍如何在asp.net web api中利用过滤器属性实现缓存. 实现过程 1,首先在web.config文件下appsettings下定义“CacheEnabled”和“CacheTi ...

  8. Hadoop 中利用 mapreduce 读写 mysql 数据

    Hadoop 中利用 mapreduce 读写 mysql 数据   有时候我们在项目中会遇到输入结果集很大,但是输出结果很小,比如一些 pv.uv 数据,然后为了实时查询的需求,或者一些 OLAP ...

  9. [.net 面向对象程序设计进阶] (21) 反射(Reflection)(下)设计模式中利用反射解耦

    [.net 面向对象程序设计进阶] (21) 反射(Reflection)(下)设计模式中利用反射解耦 本节导读:上篇文章简单介绍了.NET面向对象中一个重要的技术反射的基本应用,它可以让我们动态的调 ...

随机推荐

  1. php+tomcat 配置运行环境

    为了学习php,本教程始于:2017.11.16 完成时的截图! 1.首先下载: VC 2015++ 点击下载 2. 把下载好的php复制到本目录,然后解压并且重命名为“php”,如果没有下载php, ...

  2. 导入maven项目出现 Unsupported IClasspathEntry kind=4

    Unsupported IClasspathEntry kind=4 这个异常会导致项目无法使用spring ide启动 来自:http://blog.csdn.net/kongqz/article/ ...

  3. cordova 强制竖屏

    orentation的默认值是default 可使用的值有:default, landscape (横屏), portait (竖屏) orentation可以将设备锁定方向,不受设备旋转影响. 方案 ...

  4. 修改ligerui 默认确认按钮

    $.extend($.ligerDefaults.DialogString, {ok: '取消单据'}); showDialogPay = $.ligerDialog.alert('正在支付中,请稍候 ...

  5. Flash打开新窗口 被浏览器拦截问题 navigateToURL被拦截 真正试验结果

    众所周知,打开新窗口以前经常被用作弹出广告用,而随着浏览器发展,现在估计除了ie6之外,基本都有广告拦截功能,最基本就是拦截这种非人为的弹出新窗口.我对js研究不深,我所了解就是,必须是用户操作的处理 ...

  6. POJ2226

    题意:给定一个矩阵,当中有一些地方有水,如今有一些长度随意,宽为1的木板,要求在全部板不跨越不论什么坑的前提下,用一些木板盖住这些有水的地方,问至少须要几块板子? 思路: watermark/2/te ...

  7. 实现锁死的有滚动条的div的表格(datagird)

    JS框架使用Jquery 最终效果: 代码结构: 代码: <HEAD><TITLE>new document</TITLE> <META name=Gener ...

  8. openssl的证书格式转换

    证书转换 PKCS 全称是 Public-Key Cryptography Standards ,是由 RSA 实验室与其它安全系统开发商为促进公钥密码的发展而制订的一系列标准,PKCS 目前共发布过 ...

  9. tomcat7.0.27的bio,nio.apr高级运行模式(转)

    一 前言 tomcat的运行模式有3种.修改他们的运行模式.3种模式的运行是否成功,可以看他的启动控制台,或者启动日志.或者登录他们的默认页面http://localhost:8080/查看其中的服务 ...

  10. cocos2dx跟eclipse交叉编译“make: * No rule to make target `all' Stop”的解决方案

    cocos2dx和eclipse交叉编译“make: *** No rule to make target `all'. Stop”的解决方案 搞cocos2dx在eclipse上的交叉编译. 项目. ...