我正在实现两个相位矩阵乘法。下面的部分是第一阶段的减速机。键是左侧文件的行索引和右侧文件的列索引。 我希望输出计数与map和reducer相同。但它看起来像内循环增量与外循环相同的迭代器,因此减速器输出的数量等于键的数量。
代码:
@Override
public void reduce(Text key, Iterable<Text> values, Context context)
throws IOException, InterruptedException
{
for (Text outer : values) {
String [] outerLine = outer.toString().split("\t");
//int outerIndex = 0;
//outerIndex = outerLine[0].equalsIgnoreCase(leftFilePattern) ? outerIndex : 1;
if(outerLine[0].equalsIgnoreCase(rightFilePattern))
continue;
double outerValue = Double.parseDouble(outerLine[2]);
for (Text inner : values) {
String [] innerLine = inner.toString().split("\t");
if(innerLine[0].equalsIgnoreCase(leftFilePattern))
continue;
context.write(new Text(key.toString() + "-" + innerLine[1]),
new DoubleWritable(outerValue * Double.parseDouble(innerLine[2])));
}
}
但是当我有简单的java应用程序时,如下所示:
List<Integer> l = Arrays.asList(10, 15);
Iterable<Integer> it = l;
for (Integer in : it) {
for (Integer out : it) {
System.out.println(in + " " + out);
}
}
此处输出的数量为4.如果内部循环与减速器的情况相同,则输出计数应为1,即(10 15)。
有人可以解释这种行为。
Vishal
答案 0 :(得分:0)
实施Iterable
可能会导致这种影响。
意图似乎是每个iterator()
调用都应该返回自己的Iterator
实例。 Iterable
中的java.util
类,包括List
使用的私有Arrays.asList()
类,都是这样做的。嵌套的foreach在同一个Iterable
上需要这种行为,Iterable
的陈述目的是预先支持。
我在Iterable
API文档中找不到任何直接需要该行为的内容。
显然,如果两个iterator()
调用使用相同的对象,则同一Iterable
上的嵌套foreach语句将无法按照您描述的方式进行。
=============================================== ==========
如果发生了这种情况,我的最佳建议是首先将values
复制每个文字参考文件复制到行为良好的List<Text>
,例如ArrayList
。您可以安全地对其元素执行嵌套循环。