我正试着用每个单词来颠倒文件的内容。我有运行良好的程序,但我得到的输出是这样的东西
1 dwp
2 seviG
3 eht
4 tnerruc
5 gnikdrow
6 yrotcerid
7 ridkm
8 desU
9 ot
10 etaerc
我希望输出像这样
dwp seviG eht tnerruc gnikdrow yrotcerid ridkm desU
ot etaerc
我正在使用的代码
import java.io.IOException;
import java.util.*;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.conf.*;
import org.apache.hadoop.io.*;
import org.apache.hadoop.mapred.*;
import org.apache.hadoop.util.*;
public class Reproduce {
public static int temp =0;
public static class ReproduceMap extends MapReduceBase implements Mapper<LongWritable, Text, IntWritable, Text>{
private Text word = new Text();
@Override
public void map(LongWritable arg0, Text value,
OutputCollector<IntWritable, Text> output, Reporter reporter)
throws IOException {
String line = value.toString().concat("\n");
StringTokenizer tokenizer = new StringTokenizer(line);
while (tokenizer.hasMoreTokens()) {
word.set(new StringBuffer(tokenizer.nextToken()).reverse().toString());
temp++;
output.collect(new IntWritable(temp),word);
}
}
}
public static class ReproduceReduce extends MapReduceBase implements Reducer<IntWritable, Text, IntWritable, Text>{
@Override
public void reduce(IntWritable arg0, Iterator<Text> arg1,
OutputCollector<IntWritable, Text> arg2, Reporter arg3)
throws IOException {
String word = arg1.next().toString();
Text word1 = new Text();
word1.set(word);
arg2.collect(arg0, word1);
}
}
public static void main(String[] args) throws Exception {
JobConf conf = new JobConf(WordCount.class);
conf.setJobName("wordcount");
conf.setOutputKeyClass(IntWritable.class);
conf.setOutputValueClass(Text.class);
conf.setMapperClass(ReproduceMap.class);
conf.setReducerClass(ReproduceReduce.class);
conf.setInputFormat(TextInputFormat.class);
conf.setOutputFormat(TextOutputFormat.class);
FileInputFormat.setInputPaths(conf, new Path(args[0]));
FileOutputFormat.setOutputPath(conf, new Path(args[1]));
JobClient.runJob(conf);
}
}
如何修改输出,而不是编写另一个java程序来实现这一点
提前谢谢
5条答案
按热度按时间34gzjxbg1#
在mapper中,每个单词的键值都会递增,因此每个单词都作为一个单独的键值对进行处理。
下面的步骤应该可以解决问题1)在mapper中只需删除temp++,这样所有反转的单词的键都将是0(temp=0)。
2) reducer接收键0和反转字符串列表。在reducer中,将键设置为nullwriteable并写入输出。
bsxbgnwa2#
你可以用
NullWritable
作为输出值。nullwritable只是一个占位符,因为您不希望数字显示为输出的一部分。我已经给你上课了。注意:-需要为nullwriteable添加import语句并更改驱动程序类或主方法
pxyaymoc3#
我们可以通过编写自定义fileoutputformat类来定制输出
rsaldnfx4#
您可以尝试使用一个常量键(或者简单地说是nullwriteable),并将其作为键传递,将整行作为值传递(您可以在mapper类中反转它,也可以在reducer类中反转它)。因此,您的reducer将收到一个常量键(或者占位符,如果您将nullwriteable用作键)和完整的行。现在您可以简单地反转该行并将其写入输出文件。通过不使用tmp作为键,可以避免在输出文件中写入不需要的数字。
qcuzuvrc5#
下面是一个简单的代码演示如何使用自定义fileoutputformat
最后,我们需要在运行作业之前告诉它输出格式和路径。