zoukankan      html  css  js  c++  java
  • 如何去掉MapReduce输出的默认分隔符

    我们在用MapReduce做数据处理的时候,经常会遇到将只需要输出键或者值的情况,如context.write(new Text(record), new Text("")),这样得到结果每行尾部会自动加上一个制表符。尽管我们的值是空的,但是MapReduce默认输出的是键值对,且键值对之间默认的分隔符为制表符,这样可能对我们数据的后续处理会产生一些干扰,那么如何去掉或是更改这个制表符呢?这里提供三种解决办法:

             方法一:将键设置为空值

             一般我们用context写入数据的时候,是将要输出的值写在键处,而将值设为""。但是只要反过来,将键设为空值,而值设为我们要输出的条目,如context.write(null, new Text(record)),输出的每行后面就不会有制表符了。

             方法二:自定义输出数据格式

            自定义输出数据格式的步骤如下:

             1)定义一个继承自OutputFormat的类,不过一般继承FileOutputFormat即可;

             2)实现其getRecordWriter方法,返回一个RecordWriter类型

             3)自定义一个继承RecordWriter的类,定义去writer方法,针对每个<key,value>写入文件数据。

    具体代码参考:http://www.tuicool.com/articles/BVvMry

             如果是采用Streaming模式做MapReduce开发,可以在运行程序的时候加上-jobconf选项来修改map或者reduce输出分隔符,其参数如下:

             stream.map.output.field.separator 指定map输出时的分割符

             stream.num.map.output.key.fields  指定map输出按照分隔符切割后,key所占有的列数

             stream.reduce.output.field.separator  指定reduce输出时的分割符

             stream.num.reduce.output.key.fields  指定reduce输出按照分隔符切割后,key所占有的列数

             下面展示的是更改分割符为“,”,取前两列作为key的例子:

             -jobconfstream.map.output.field.separator=','

             -jobconfstream.num.map.output.key.fields=2

             参考:http://wingmzy.iteye.com/blog/1260570    

             方法三:文本处理删除TAB键

             如果已经得到了含有Tab键MapReduce的输出,可以直接在本地做文本处理,去掉里面的Tab键,以Java代码为例:

    import java.io.BufferedReader;
    import java.io.BufferedWriter;
    import java.io.File;
    import java.io.FileReader;
    import java.io.FileWriter;

    public class DeleteTAB {

    public static void main(String[] args) {
    try {
    File file = new File("output.txt");
    BufferedReader reader = new BufferedReader(new FileReader("input.txt"));
    BufferedWriter writer = new BufferedWriter(new FileWriter(file));
    try {
    String line = new String();
    while((line=reader.readLine()) != null) {
    line = line.replaceAll("\s*", ""); //"\s"表示所有空白符
    writer.append(line);
    writer.newLine();
    }
    } catch (Exception e) {
    e.printStackTrace();
    } finally {
    reader.close();
    writer.close();
    }
    } catch (Exception e) {
    e.printStackTrace();
    }

    }

    }

    ---------------------
    作者:xidianycy
    来源:CSDN
    原文:https://blog.csdn.net/u014374284/article/details/44918255
    版权声明:本文为博主原创文章,转载请附上博文链接!

  • 相关阅读:
    Spring-boot-admin功能说明
    Spring Boot Admin 的使用 2
    Spring Boot Admin的使用
    windows下的Nodejs及npm的安装、常用命令,Nodejs开发环境配置
    dataTables-使用详细说明整理
    JQuery Datatables Dom 和 Language 参数详细说明
    深入SpringBoot:自定义PropertySourceLoader
    java complier compliance level问题引发的思考
    在线代码格式化工具
    Gradle中的buildScript代码块
  • 原文地址:https://www.cnblogs.com/wmxl/p/10294344.html
Copyright © 2011-2022 走看看