我是mapreduce的初学者。我希望我的简化过程如下: 给定一组相同键的输入,如(key1,100),(key1,#50),(key1,#25),我想输出(key1,50 / 100),(key1,25 / 100)。这是#'#'除以没有'#'
的值因为我认为在地图处理之后,(key1,100)的位置可能是未知的。因此,我遍历整个集合以获取(key1,100)并将#50,#25存储到列表中。然后遍历列表以计算50 / 100,25 / 100。那可以吗?这是我的代码:
public static class MyReducer extends Reducer<Text,Text,Text,Text> {
private Text reskey = new Text();
private Text resvalue = new Text();
private List<String> arr = new ArrayList<String>();
public void reduce(Text key, Iterable<Text> values,
Context context
) throws IOException, InterruptedException {
try {
String prefix = new String(key.toString());
int total = 0;
for (Text val : values) {
String value = new String(val.toString());
if (!value.contains("#")) {
total = Integer.parseInt(value);
}else{
arr.add(value);
}
}
for (int i = 0 ; i < arr.size() ; ++i) {
String value = arr.get(i);
if (value.contains("#")) {
String[] words = value.split("#");
int number = Integer.parseInt(words[1]);
double probability = 1.0 * number / total;
reskey.set(prefix);
resvalue.set(Double.toString(probability));
context.write(reskey, resvalue);
}
}
arr.clear();
}catch (Exception e)
{
e.printStackTrace();
}
}
}
现在的问题是变量&#39; total&#39;在第二个for循环中始终保持为0.我认为应该在第一个for循环中分配,因为当我在第一个for循环中打印它时它不是0.但是在第二个for循环中它变为0(初始值)。可能是什么原因?谢谢!