我刚开始学习Hadoop。我想使用reduce()
的输出并对其进行一些操作。我正在处理新API并尝试使用JobControl
,但它似乎不适用于新API。
任何出路?
答案 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));
}
}