我想编写一个mapreduce代码,用于计算给定CSV文件中的记录数量。我没有在地图中做什么,以及如何做以减少如何解决这个问题,任何人都可以提出建议?
答案 0 :(得分:4)
答案 1 :(得分:3)
您的映射器必须发出固定密钥(只使用值为“count”的文本)固定值为1(与您在wordcount示例中看到的相同)。
然后只需使用LongSumReducer作为缩减器。
作业的输出将是一个记录,其键为“count”,值为您要查找的记录数。
您可以选择(戏剧性地!)通过使用相同的LongSumReducer作为合并器来提高性能。
答案 2 :(得分:1)
希望我有一个比接受的答案更好的解决方案。
不是为每条记录发出1,为什么不在map()中递增一个计数器,并在cleanup()中的每个map任务之后发出递增的计数器。
可以减少中间读写。而reducer只需聚合少量值列表。
public class LineCntMapper extends
Mapper<LongWritable, Text, Text, IntWritable> {
Text keyEmit = new Text("Total Lines");
IntWritable valEmit = new IntWritable();
int partialSum = 0;
public void map(LongWritable key, Text value, Context context) {
partialSum++;
}
public void cleanup(Context context) {
valEmit.set(partialSum);
context.write(keyEmit, valEmit);
}
}
您可以找到完整的工作代码here
答案 3 :(得分:0)
使用 job.getcounters()检索作业完成后每条记录增加的值。如果您使用java编写mapreduce作业,请使用 enum 进行计数机制。
答案 4 :(得分:0)
import java.io.IOException;
import java.util.*;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.*;
import org.apache.hadoop.mapred.*;
public class LineCount
{
public static class Map extends MapReduceBase implements
Mapper<LongWritable, Text, Text, IntWritable>
{
private final static IntWritable one = new IntWritable(1);
private Text word = new Text("Total Lines");
public void map(LongWritable key, Text value,
OutputCollector<Text, IntWritable> output,Reporter reporter)
throws IOException
{
output.collect(word, one);
}
}
public static class Reduce extends MapReduceBase implements
Reducer<Text, IntWritable, Text, IntWritable> {
public void reduce(Text key, Iterator<IntWritable> values,
OutputCollector<Text, IntWritable> output, Reporter reporter)
throws IOException {
int sum = 0;
while (values.hasNext()) {
sum += values.next().get();
}
output.collect(key, new IntWritable(sum));
}
}
public static void main(String[] args) throws Exception {
JobConf conf = new JobConf(LineCount.class);
conf.setJobName("LineCount");
conf.setNumReduceTasks(5);
conf.setOutputKeyClass(Text.class);
conf.setOutputValueClass(IntWritable.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);
}
}
答案 5 :(得分:0)
我只使用身份Mapper和身份Reducer。
这是Mapper.class和Reducer.class。然后阅读map input records
你真的不需要做任何编码来获得这个。