mapreduce计算tab分隔的输入值之和

u4dcyp6a  于 2021-05-29  发布在  Hadoop
关注(0)|答案(1)|浏览(690)

我试图使用mapreduce来查找由标签分隔的tab分隔的输入的总和。数据是这样的

  1. 1 5.0 4.0 6.0
  2. 2 2.0 1.0 3.0
  3. 1 3.0 4.0 8.0

第一列是类标签,所以我希望输出按类标签分类。对于这个示例,输出将是

  1. label 1: 30.0
  2. label 2: 6.0

这是我尝试过的代码,但是我得到了错误的输出
将显示意外的类标签。

  1. public class Total {
  2. public static class Map extends Mapper<LongWritable, Text, Text, DoubleWritable> {
  3. private final static DoubleWritable one = new DoubleWritable();
  4. private Text word = new Text();
  5. public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
  6. String line = value.toString();
  7. StringTokenizer tokenizer = new StringTokenizer(line);
  8. word.set(tokenizer.nextToken());
  9. while (tokenizer.hasMoreTokens()) {
  10. one.set(Double.valueOf(tokenizer.nextToken()));
  11. context.write(word, one);
  12. }
  13. }
  14. }
  1. public static class Reduce extends Reducer<Text, DoubleWritable, Text, DoubleWritable> {
  2. private Text Msg = new Text();
  3. public void reduce(Text key, Iterable<DoubleWritable> values, Context context)
  4. throws IOException, InterruptedException {
  5. firstMsg.set("label " + key+": Total");
  6. Double sum = 0.0;
  7. for (DoubleWritable val : values) {
  8. sum += val.get();
  9. }
  10. context.write(Msg, new DoubleWritable(sum));
  11. }
  12. }
  13. //void method implementation also exists
  14. }
oug3syen

oug3syen1#

您的目标是将所有相同的键放入它们自己的减速机中,这样您就可以对这些数字求和。
所以,拿着这个

  1. 1 5.0 4.0 6.0
  2. 2 2.0 1.0 3.0
  3. 1 3.0 4.0 8.0

从本质上说就是创造这个

  1. 1 [(5 .0 4.0 6.0), (3.0 4.0 8.0)]
  2. 2 [(2.0 1.0 3.0)]

因此,您的Map应该只输出键1和键2,每个键后面都有剩余的值,每个键不一定有很多值。
为此,您可以使用 Mapper<LongWritable, Text, Text, Text> . (将输出数据类型更改为 Text )

  1. public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
  2. String line = value.toString();
  3. StringTokenizer tokenizer = new StringTokenizer(line);
  4. word.set("label " + tokenizer.nextToken());
  5. StringBuilder remainder = new StringBuilder();
  6. while (tokenizer.hasMoreTokens()) {
  7. remainder.append(tokenizer.nextToken()).append(",");
  8. }
  9. String output = remainder.setLength(remainder.getLength() - 1).toString()
  10. context.write(word, new Text(output));
  11. }

然后,在减速器中,使其 Reducer<Text, Text, Text, DoubleWritable> (读入 (Text,Text) 你现在有一个 Iterable<Text> values 它是一个由逗号分隔的字符串组成的iterable,可以将其解析为double,并取累积和。
你真的不需要 firstMsg.set 在减速器中的零件-可以在Map器中完成。

展开查看全部

相关问题