如何操作reduce()输出并将其存储在另一个文件中?

时间:2013-12-31 21:00:45

标签: hadoop

我刚开始学习Hadoop。我想使用reduce()的输出并对其进行一些操作。我正在处理新API并尝试使用JobControl,但它似乎不适用于新API。

任何出路?

3 个答案:

答案 0 :(得分:1)

不确定你要做什么。您想将不同类型的输出发送到不同的输出格式吗? Check This如果您想要对地图中的值进行过滤或操作,则reduce是执行此操作的最佳位置。

答案 1 :(得分:1)

您可以使用ChainReducer创建[MAP+ / REDUCE MAP*]形式的作业,即几个地图后跟一个reducer,然后是另一系列地图,这些地图首先处理Reducer的输出。最终输出是最后一个Mapper的输出。

或者,您可以有多个按顺序启动的作业,而前一个减速器的输出是下一个的输入。但是,这会导致不必要的IO,因为您对中间输出不感兴趣

答案 2 :(得分:0)

在reducer中做任何你想做的事,创建一个 FSDataOutputStream 并通过它写出输出。

例如:

public static class TokenCounterReducer extends
            Reducer<Text, IntWritable, Text, IntWritable> {
        public void reduce(Text key, Iterable<IntWritable> values,
                Context context) throws IOException, InterruptedException {

            FileSystem fs = FileSystem.get(context.getConfiguration());
            FSDataOutputStream out = fs.create(new Path("/path/to/your/file"));
            //do the manipulation and write it down to the file
            out.write(......);
            int sum = 0;
            for (IntWritable value : values) {
                sum += value.get();
            }
            context.write(key, new IntWritable(sum));
        }
    }