如何去掉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
版权声明:本文为博主原创文章,转载请附上博文链接!
如何去掉MapReduce输出的默认分隔符的更多相关文章
- 去掉谷歌浏览器获取焦点时默认的input、textarea的边框和背景
去掉chrome(谷歌)浏览器默认的input.textarea的边框(border)和背景(background) 及chrome下不可更改textarea大小 1.使用Chrome的都知道,当鼠标 ...
- 去掉iphone手机滑动默认行为
/*去掉iphone手机滑动默认行为*/ $('body').on('touchmove', function (event) { event.preventDefault(); });
- MySQL更改命令行默认分隔符
MySQL命令行默认语句分隔符为分号 ; 使用DELIMITER命令可以更改默认分隔符 mysql> DELIMITER // 将默认分割符改为 //
- html5中如何去掉input type date默认
html5中如何去掉input type date默认样式 2.对日期时间控件的样式进行修改目前WebKit下有如下9个伪元素可以改变日期控件的UI:::-webkit-datetime-edit – ...
- <a>标签中的href="javascript:;"就是去掉a标签的默认行为
<a>标签中的href="javascript:;"是什么意思? 例子:<a href="javascript:;">我的大学</ ...
- hive默认分隔符
默认分隔符‘\001',对应ascii码SOH: 通过cat -A filename可以查看分隔符:
- 【转】html5中如何去掉input type date默认样式
html5中如何去掉input type date默认样式1.时间选择的种类:HTML代码: 选择日期:<input type="date" value="2017 ...
- html5中如何去掉input type date默认样式
html5中如何去掉input type date默认样式 1.时间选择的种类: HTML代码: 选择日期:<input type="date" value="20 ...
- Hive 默认分隔符
引言 Hive 中的默认分隔符是 ^A (\001) ,这是一种特殊的分隔符,使用的是 ASCII 编码的值,键盘是打不出来的 查看 Hive 默认分隔符文件 Linux 上的文件 以 \001 作为 ...
随机推荐
- .apache.commons.io 源代码学习(二)FilenameUtils类
FilenameUtils是apache common io中一个独立的工具类,对其他没有依赖,看其源代码的import即可知道. import java.io.File;import java.io ...
- 鸭子-策略模式(Strategy)
前言 万事开头难,最近对这句话体会深刻!这篇文章是这个系列正式开始介绍设计模式的第一篇,所以肩负着确定这个系列风格的历史重任,它在我脑袋里默默地酝酿了好多天,却只搜刮出了一点儿不太清晰的轮廓,可是时间 ...
- PHP获取IP的方法
function getIP() { if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) { $realip = $_SERVER['HTTP_X_FORWARD ...
- 一篇好文档,请Thymeleaf Layout Dialect
Thymeleaf Layout Dialect https://ultraq.github.io/thymeleaf-layout-dialect/ This will introduce the ...
- (2)OLEDB数据库操作
1.首先要引入 System.Data.OracleClient.dll 2.引入命名空间 using System.Data.OleDb; OleDb类 https://msdn.microsof ...
- 新疆大学ACM-ICPC程序设计竞赛五月月赛(同步赛)C 勤奋的杨老师【DP/正反LIS/类似合唱队形】
链接:https://www.nowcoder.com/acm/contest/116/C 来源:牛客网 题目描述 杨老师认为他的学习能力曲线是一个拱形.勤奋的他根据时间的先后顺序罗列了一个学习清单, ...
- Python与数据结构[1] -> 栈/Stack[1] -> 中缀表达式与后缀表达式的转换和计算
中缀表达式与后缀表达式的转换和计算 目录 中缀表达式转换为后缀表达式 后缀表达式的计算 1 中缀表达式转换为后缀表达式 中缀表达式转换为后缀表达式的实现方式为: 依次获取中缀表达式的元素, 若元素为操 ...
- Map泛型集合-显示企鹅信息
package collection; /** * 宠物类 * @author * */ public class Pet { private String name; private String ...
- ASIHTTPRequest框架使用总结系列之阿堂教程5(上传数据)
在上篇文章中,阿堂和网友们分享了如何用ASIHTTPRequest框架下载数据的实例,本篇阿堂将数据介绍如何用ASIHTTPRequest框架上传数据的应用实例. 数据上传是通过ASIHT ...
- 数据库字段名称转java字段名称
/** * * @Title: changeToJavaFiled * @Description: TODO(将数据库中带下划线的字段转换为Java常用的驼峰字段) * @param @param f ...