如何将Hadoop Reducer的最终输出写入文本文件?



我是Hadoop的新手。我试图修改 WordCount 示例以执行以下任务(将键设置为第二个元素,并将第四和第五个元素设置为该键的对应值,然后根据键值将它们组合在一起并将最终结果写入文本文件):

Input.txt :
a:b:c:d:e:f
g:h:i:j:k:l
m:b:n:o:p:q
Output.txt :
b:d:o:e:p
h:j:k

这是我的代码:

public class Test {
    public static class Map extends MapReduceBase implements
            Mapper<LongWritable, Text, Text, Text> {
        private Text word = new Text();
        public void map(LongWritable key, Text value,
                OutputCollector<Text, Text> output, Reporter reporter)
                throws IOException {
                String [] temp = value.toString().split(":");
                String remainder = temp[3] + ":" +temp[4];
                output.collect(new Text(temp[1]), new Text(remainder));
            }
        }

    public static class Reduce extends MapReduceBase implements
            Reducer<Text, Text, Text, Text> {
        public void reduce(Text key, Iterator<Text> values,
                OutputCollector<Text, Text> output, Reporter reporter)
                throws IOException {
            String temp ="";
            while (values.hasNext()) {
                temp = temp + values.next().toString();     
            }
            //String remainder = ":" +temp;
            output.collect(key,new Text(temp));// point
            // :
            // distance
        }
    }
    public static void main(String[] args) throws Exception {
        JobConf conf = new JobConf(Test.class);
        conf.setJobName("pivotpoints");
        System.out.println(conf.getNumMapTasks() + "map runs");
        conf.setOutputKeyClass(Text.class);
        conf.setOutputValueClass(Text.class);
        conf.setMapperClass(Map.class);
        conf.setCombinerClass(Reduce.class);
        conf.setReducerClass(Reduce.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); 
    }   
}

这是我从上面的代码中获得的输出:

part-00000 :
b d:eo:p
h j:k

所以,我的问题是:如何使用特殊的分隔符号使Hadoop将最终输出写入给定格式的文本文件中?

在主类的配置中设置属性 mapreduce.output.textoutputformat.separator。

conf.set("mapreduce.output.textoutputformat.separator",":");

映射发出以下序列,

key value 
b d
b e
h j
h k
b o
b p

化简器会自动将其分组为

b [d, e, o, p]
h [j, k]

您可以遍历化简器中每个键的值列表,并将您的 : 放在值之间,将它们连接成单个字符串。

然后减速器可以发射

Key Value 
b d:e:o:p (your concatenated string)
h j:k (your concatenated string)

由于您已将分隔符设置为 :因此输出文件的tab将按预期获得结果。

相关内容

  • 没有找到相关文章

最新更新