【导读】

hadoop源代码中org.apache.hadoop.mapred.lib.MultipleTextOutputFormat类实现了多路输出的框架。在此基础上,可以实现自定义的多路输出方案。

本篇给出了带后缀的多路输出方案。比如part-00000-[A-Z], part-00000-[a-z], part-00000-[0-9]。

【正文】
1.  约定reduce输出时的数据格式:

<key, value>#suffix_letter

suffix_letter表示后缀字母,目前支持[0-9A-Za-z]共62个字符。可以是常量,也可以是变量。

value可以为空。

通俗地说,只需要在输出的一行结尾加上“#suffix_letter” 就能支持多路

2. 实现

SuffixMultipleTextOutputFormat.java

package com.**.hadoop.mapred.lib;import org.apache.hadoop.mapred.lib.MultipleTextOutputFormat;
import org.apache.hadoop.io.Text;public class SuffixMultipleTextOutputFormat extends MultipleTextOutputFormat<Text, Text> {private int tagPos = -1;private boolean has_value = true;public void test(Text key, Text value, String name) {System.out.println("file_name = " + this.generateFileNameForKeyValue(key, value, name));System.out.println("key = " + this.generateActualKey(key, value));System.out.println("value = " + this.generateActualValue(key, value));}@Overrideprotected Text generateActualKey(Text key, Text value) {if (!has_value && tagPos != -1) {return new Text(key.toString().substring(0, tagPos));}return key;}@Overrideprotected Text generateActualValue(Text key, Text value) {if (has_value && tagPos != -1) {return new Text(value.toString().substring(0, tagPos));}return value;}@Override  protected String generateFileNameForKeyValue(Text key, Text value, String name) {String val = value.toString();if (val.isEmpty()) {has_value = false;val = key.toString();}try {int pos = val.lastIndexOf('#');if (pos >= 0 && pos == val.length() - 2) {char suffix = val.charAt(pos+1);if (Character.isDigit(suffix) || Character.isLetter(suffix)) {tagPos = pos;return name + "-" + suffix;} else {throw new InvalidSuffixMultipleTextOutputFormatException("InvalidSuffixMultipleTextOutputFormatException : key = " + key.toString() + " , value = " + value.toString());}} else {throw new InvalidSuffixMultipleTextOutputFormatException("InvalidSuffixMultipleTextOutputFormatException : key = " + key.toString() + " , value = " + value.toString());}} catch (Exception e) {e.printStackTrace();}return name;}public static void main(String [] args) {new SuffixMultipleTextOutputFormat().test(new Text("abc"), new Text("#i"), "part-00000");new SuffixMultipleTextOutputFormat().test(new Text("abc"), new Text("#"), "part-00001");new SuffixMultipleTextOutputFormat().test(new Text("abc"), new Text("w#o"), "part-00001");new SuffixMultipleTextOutputFormat().test(new Text("abc#0"), new Text(""), "part-00001");new SuffixMultipleTextOutputFormat().test(new Text("abc#0"), new Text("a"), "part-00001");}}

InvalidSuffixMultipleTextOutputFormatException.java

package com.**.hadoop.mapred.lib;public class InvalidSuffixMultipleTextOutputFormatException extends Exception {private static final long serialVersionUID = -7900596082142417867L;public InvalidSuffixMultipleTextOutputFormatException(String error) {super(error);}}

hadoop中带后缀的多路输出part文件相关推荐

  1. IOl:从文件夹中找到后缀名为TXT的文件,然后复制到指定的文件夹

    /*** 从文件夹中找到后缀名为TXT的文件,然后复制到指定的文件夹* @param args* @throws IOException*/public static void main(String ...

  2. java中application后缀_编译JavaApplication源程序文件将产生相应的字节码文件,这些字节码文件的扩展名为...

    编译全球第一大消场是费市. 程序面"面从布局战略个全党和全严治"四是指. 同的些共学科了当课程在着重视重视重视重视国课革中个别趋势代世的一的是的_的培和知内容能力程改差异反映发展养 ...

  3. python中把输出结果写到一个文件中_如何将脚本输出写入文件和命令行?

    你看不到任何东西的事实可能与缓冲正在发生的事实有关.所以你只能得到每4千分左右的文本输出. 相反,试试这样的方法:class OutputSplitter(object): def __init__( ...

  4. Hadoop Streaming 实战: 多路输出

    streaming把reduce的输出作为一个任务的最终输出,输出文件形如:       part-00000.part-00001--       文件个数为reduce任务个数 但是,有的时候,我 ...

  5. PCB制造输出中各种后缀的GerBer文件说明

    PCB制造输出中各种后缀的GerBer文件说明 顶层/底层线路层(.GTL/.GBL) 顶层/底层丝印层(GTO/.GBO) 顶层/底层锡膏层(GTP/.GBP) 顶层/底层阻焊层(GTS/.GBS) ...

  6. hadoop中MapReduce中压缩的使用及4种压缩格式的特征的比较

    在比较四中压缩方法之前,先来点干的,说一下在MapReduce的job中怎么使用压缩. MapReduce的压缩分为map端输出内容的压缩和reduce端输出的压缩,配置很简单,只要在作业的conf中 ...

  7. Hadoop中Writable类

    1.Writable简单介绍 在前面的博客中,经常出现IntWritable,ByteWritable.....光从字面上,就可以看出,给人的感觉是基本数据类型 和 序列化!在Hadoop中自带的or ...

  8. 4种常用压缩格式在hadoop中的应用

    目前在hadoop中用得比较多的有lzo,gzip,snappy,bzip2这4种压缩格式,笔者根据实践经验介绍一下这4种压缩格式的优缺点和应用场景,以便大家在实践中根据实际情况选择不同的压缩格式. ...

  9. 多路输出开关电源的设计及应用原则

    1引言 对现代电子系统,即便是最简单的由单片机和单一I/O接口电路所组成的电子系统来讲, 其电源电压一般也要由+5V,±15V或±12V等多路组成,而对较复杂的电子系统来讲,实际用到的电源电压就更多了 ...

最新文章

  1. oracle建表权限问题和JSP连接oracle数据库基本操作
  2. PL/SQL-2 复合数据类型
  3. 陕西专科学校王牌计算机专业,陕西省高职专科院校排名+王牌专业
  4. Class.forName()和ClassLoader.getSystemClassLoader().loadClass()区别
  5. xampp配置时几个重要的目录
  6. Eclipse 中如何设置字体大小与样式
  7. php 打乱数组的顺序,php数组打乱顺序
  8. 原生js对数组操作(find,findIndex)
  9. 神经网络 demo(斯坦福)
  10. 超详细的UI设计软件教程与资料
  11. zzulioj1001C语言答案,ZZULIOJ
  12. 游戏程序开发的工作主要包括哪些方面
  13. extmail如何登陆mysql_linux下ExtMail邮件使用及管理平台
  14. sql数据库中毒,扩展名被改为.supporthelpgood​,.666decrypt666​​​​​​,.xxxxx,.dom,勒索病毒加密该如何恢复数据
  15. vue cli4接入环信webIM
  16. XCOM2.0接收数据为0
  17. mmdetection使用
  18. Adobe国际认证中文官网
  19. 如何安装 zlib-dev
  20. Mac Os微信多开小助手安装教程

热门文章

  1. 女神节快乐!Apache Pulsar 愿大家拥抱机遇、享受开源
  2. 椭圆曲线公钥密码体制
  3. IDEA项目中与Git仓库出现的常见问题_小结
  4. 《英语口语900句 (624页+360分钟录音)》(Oral English 900 Expressions)
  5. win7 virtualbox使用vagrant下载centos/7
  6. 【吐血整理】互联网大厂面试遇到的100道软件测试面试题+答案
  7. 张三的奶牛踩花:C++用贪心法解POJ3262_Protecting the Flowers问题
  8. 51单片机8位带符号乘法运算(汇编)
  9. 51单片机hc-sr04超声波模块控制的c语言编程,基于STM32单片机对HCSR04超声波的控制...
  10. 委托(C# 编程指南)