我正在使用0 reduce方法解决我的问题。我希望从一个文件预处理数据,然后将其作为另一个文件写出来,但没有新的行和制表符分隔符?如何输出处理我的数据的地图作业,使用相同的文件格式减去预处理。 也就是说,我有这样的事情:
预处理:
<TITLE> Herp derp </Title> I am a major general
后期处理:
Herp
Derp
I
am
a
major
general
我想要它做的是:
Herp Derp I am a major general
我认为问题在于这行代码:
job.setOutputFormatClass(TextOutputFormat.class);
然而,当我尝试时,非常天真地做类似的事情:
job.setOutputFormatClass(null);
显然不行。是否提供了可用于执行此操作的格式类?如果没有,我怎么能写我自己的类来输出我想要的一切?我是hadoop和map的新手。
我在下面添加了我的地图功能。我不想使用reduce,因为它会在map和reducer之间进行排序。
public void map(LongWritable key, Text value, Context context)
throws IOException, InterruptedException {
String line = value.toString();
StringTokenizer tokenizer = new StringTokenizer(line);
while (tokenizer.hasMoreTokens()) {
word.set(tokenizer.nextToken());
//Did preprocessing here, irrelevant to my problem
context.write(word, null);
}
}
另外,我也搜索了这个并阅读apache hadoop api,看看我是否可以回答一下。
答案 0 :(得分:1)
在mapper类中,尝试将整行发送到
,而不是将您的行解析为单个单词并将其写出来。context.write(word, null);
这样就可以保持你原来一起工作的整个字符串,而不是一条一条地发出这条线。
因此,在预处理工作中将字符串分开,然后在使用context.write命令发送它时将其重新组合在一起。
答案 1 :(得分:0)
如果您的映射器正在从单个输入行写入包含单个标记的多个记录,那么您绝对需要一个reducer将这些标记重新组合成一行以进行输出。没有减速器就不能这样做。