如何去掉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
版权声明:本文为博主原创文章,转载请附上博文链接!

原文地址:https://www.cnblogs.com/wmxl/p/10294344.html

时间: 2024-08-29 06:40:57

如何去掉MapReduce输出的默认分隔符的相关文章

去掉谷歌浏览器获取焦点时默认的input、textarea的边框和背景

本文主要核心内容为:去掉chrome(谷歌)浏览器默认的input.textarea的边框(border)和背景(background) 及chrome下不可更改textarea大小,感兴趣的朋友可以了解下 去掉chrome(谷歌)浏览器默认的input.textarea的边框(border)和背景(background) 及chrome下不可更改textarea大小 1.使用Chrome的都知道,当鼠标焦点在input.textarea这些元素上时,Chrome默认的会给它们加上黄色的边框,我

去掉iphone手机滑动默认行为

/*去掉iphone手机滑动默认行为*/ $('body').on('touchmove', function (event) { event.preventDefault(); });

9.2.1 hadoop mapreduce任务输出的默认排序

任务的默认排序 MapTask和ReduceTask都会默认对数据按照key进行排序,不管逻辑上是否需要.默认是按照字典顺序排序,且实现该排序的方法是快速排序.但是map和reduce任务只能保证单个任务内部输出有序,不能保证所有输出全局有序. MapTask,当环形缓冲区使用率到达一定阈值后进行一次快速排序,将这些有序数据溢写到磁盘上,而当数据处理完毕后,它会对磁盘上所有文件进行归并排序.ReduceTask,它从每个MapTask上远程拷贝相应的数据文件,如果文件大小超过一定阈值,则溢写到磁

去掉php框架CI默认url中的index.php

CI默认的rewrite url中是类似这样的 例如你的CI根目录是在/CodeIgniter/下,你的下面的二级url就类似这样 http://localhost/CodeIgniter/index.php/welcome. 不太好看,怎么把其中的index.php取掉呢? 解决方法如下: 第一步: Apache Url Rewrite 配置(php伪静态) 检查 Apache 中 conf/httpd.conf 中是否存在如下一段代码: #LoadModule rewrite_module

单词统计:对程序设计语言源文件统计字符数、单词数、行数,统计结果以指定格式输出到默认文件中

项目地址:https://gitee.com/loyal888/WordCount 一.工具篇   1.1 IDEA+gitee+git       方便push和增加开发效率,自从用了idea,不可能用eclipse,这辈子都不可能了!      Let's do it! 1.1.1 安装idea gitee插件 http://git.mydoc.io/?t=153739 1.2 下载ar2exe(用于将jar包生成exe文件) 文件下载地址:https://down8.3987.com/20

去掉el-table表格的默认样式,表头颜色,hover的效果

!important不起作用,     scoped  和/deep/使用  在需要改的地方的前边一定要加上  .el-table <style  scoped> /deep/ .el-table th{ background-color: white ; } /* 表尾 */ /deep/ .el-table .el-table__footer-wrapper tbody td { background-color: white; } /* 表头 */ /deep/  .el-table__

awk学习随常记录

回顾:字符串处理 数组: 数组 : declare -a index: 0- 关联数组 : declare -A 编程:数据结构和算法 字符串处理: 切片.查找替换.查找删除.变量赋值 GUN awk: 文本处理三工具: grep ,sed ,awk grep:grep.egrep .fgrep:文本过滤工具:pattern sed:行编辑器 模式空间.保持空间 awk:报告生成器,格式化文本输出; AWK: aho,weinberger, kernigha 命名就用三个人名字的首字母 awk主

TP框架模板中默认值输出

我们可以给变量输出提供默认值,例如: {$user.nickname|default="这家伙很懒,什么也没留下"} 对系统变量依然可以支持默认值输出,例如: {$Think.get.name|default="名称为空"} 默认值和函数可以同时使用,例如: {$Think.get.name|getName|default="名称为空"} Default!

MapReduce输入输出类型、格式及实例

输入格式 1.输入分片与记录 2.文件输入 3.文本输入 4.二进制输入 5.多文件输入 6.数据库格式输入 1.输入分片与记录 1.JobClient通过指定的输入文件的格式来生成数据分片InputSplit. 2.一个分片不是数据本身,而是可分片数据的引用. 3.InputFormat接口负责生成分片. InputFormat 负责处理MR的输入部分,有三个作用: 验证作业的输入是否规范. 把输入文件切分成InputSplit. 提供RecordReader 的实现类,把InputSplit