Map减少输入格式

时间:2013-08-14 13:06:51

标签: hadoop mapreduce

我是hadoop的新手。并希望像map这样输入int到mapper:

1 2 3 4 ////// 6 7 8

3 3 2 1 ////// 5 9 0

===== //////// -----

键/////////值

键中的第四个和值中的下一个3个数字? 你能帮助我在mapper类的java中编写它吗?

我不想从文件中读取它。

2 个答案:

答案 0 :(得分:0)

我不确定“不想从文件中读取”是什么意思。我想你需要做的是从文件中读取每一行并将每行分成'//////'。

public static class MapClass 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 line = value.toString();
        StringTokenizer tokenizer = new StringTokenizer(line, "//////",
                false);
        word.set("key:"+tokenizer.nextToken());
        output.collect(word, new Text("value="+tokenizer.nextToken()));
    }
}

答案 1 :(得分:0)

如果你愿意,你可以在映射器之前从值中拆分键,我想这是一种更容易的方法来完成你想做的事情。可以使用KeyValueTextInputFormat作为输入类来完成。这正是你所需要的;它允许您选择分隔符/分隔符,该分隔符/分隔符将键与传递给映射器的值分开。您可以通过执行以下操作来设置:

job.setInputFormatClass(KeyValueTextInputFormat.class);

然后您可以通过输入以下内容来选择分隔符:

Configuration conf = new Configuration(); conf.set("mapreduce.input.keyvaluelinerecordreader.key.value.separator","//////");

然后当它到达你的映射器时,它已经分裂了。