我们在用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
版权声明:本文为博主原创文章,转载请附上博文链接!

最新文章

  1. HTML5的实用
  2. Spring4 + Quartz-2.2.0集成实例
  3. Windows8 10设置程序为 系统默认浏览器
  4. 对NSNumber的理解
  5. Kakfa
  6. uC/OS - III 移植 IAR平台
  7. [一]初识Json
  8. 阿里云1218动态css3代码
  9. 生活沉思录 via 哲理小故事(四)
  10. nginx响应高并发参数配置
  11. MySQL长短密码
  12. 【leetcode】123. Best Time to Buy and Sell Stock III
  13. mysql case when group by实例
  14. 线程池内的异步线程创建UI控件,造成UI线程卡死无响应的问题分析
  15. vue零基础学习--搭建项目
  16. VB进行RGB分色
  17. 通过随机数获得学生成绩,并把每个元素赋值为学生的分数成绩,通过增强for循环遍历结果。
  18. 微信小程序--代码构成---WXSS 样式
  19. sql去除重复语句
  20. Vue.Js的用户体验优化

热门文章

  1. Razor 常用方法
  2. (1)C#工具箱-公共控件1
  3. 洛谷 P3955 图书管理员【模拟/思维】
  4. List集合-保存和输出宠物信息
  5. EF执行存储工程报错 String[4]: Size 属性具有无效大小值 0。
  6. SQL Server 获取日期是星期周几(默认从周日开始到周六 1-7)
  7. 提高MSSQL数据库性能(1)对比count(*) 和 替代count(*)
  8. linux mysql cluser集群
  9. UIWebView to view self signed websites (No private api, not NSURLConnection) - is it possible?
  10. SpringBoot 框架整合webservice