gpt4 book ai didi

java - MapReduce 计算制表符分隔输入值的总和

转载 作者:可可西里 更新时间:2023-11-01 15:27:51 24 4
gpt4 key购买 nike

我正在尝试使用 MapReduce 来查找由其标签分隔的制表符分隔输入的总和。数据看起来像这样

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

第一列是类标签,因此我希望得到按类标签分类的输出。对于这种情况,输出将是

label 1: 30.0
label 2: 6.0

这是我试过的代码,但我得到了错误的输出和

显示了意外的类标签。

public class Total {

public static class Map extends Mapper<LongWritable, Text, Text, DoubleWritable> {
private final static DoubleWritable one = new DoubleWritable();
private Text word = new Text();

public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
String line = value.toString();
StringTokenizer tokenizer = new StringTokenizer(line);
word.set(tokenizer.nextToken());
while (tokenizer.hasMoreTokens()) {
one.set(Double.valueOf(tokenizer.nextToken()));
context.write(word, one);
}
}
}

 public static class Reduce extends Reducer<Text, DoubleWritable, Text, DoubleWritable> {
private Text Msg = new Text();


public void reduce(Text key, Iterable<DoubleWritable> values, Context context)
throws IOException, InterruptedException {
firstMsg.set("label " + key+": Total");

Double sum = 0.0;

for (DoubleWritable val : values) {

sum += val.get();


}

context.write(Msg, new DoubleWritable(sum));

}
}
//void method implementation also exists
}

最佳答案

您的目标是将所有相同的键放入它们自己的缩减器中,以便您可以对数字求和。

所以,拿这个

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

本质上是创造这个

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

因此,您的 map 应该只输出键 1 和 2,每个键后面都有剩余的值,每个键不一定有很多值。

为此,您可以使用 Mapper<LongWritable, Text, Text, Text> . (将输出数据类型更改为 Text )

public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
String line = value.toString();

StringTokenizer tokenizer = new StringTokenizer(line);
word.set("label " + tokenizer.nextToken());

StringBuilder remainder = new StringBuilder();
while (tokenizer.hasMoreTokens()) {
remainder.append(tokenizer.nextToken()).append(",");
}
String output = remainder.setLength(remainder.getLength() - 1).toString()
context.write(word, new Text(output));
}

然后,在 Reducer 中,将其设为 Reducer<Text, Text, Text, DoubleWritable> (阅读 (Text,Text) 对),你现在有一个 Iterable<Text> values这是逗号分隔字符串的可迭代,您可以将其解析为 double ,并取累计和。

你真的不需要 firstMsg.set reducer 中的一 block - 这可以在映射器中完成。

关于java - MapReduce 计算制表符分隔输入值的总和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41010256/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com