二相行列乗算を実装しています。次の部品は、第 1 フェーズの減速機用です。キーは、左側のファイルの行インデックスと右側のファイルの列インデックスです。マップする出力カウントとリデューサーが同じになることを期待しています。しかし、内側のループは外側のループと同じ反復子をインクリメントするように見えるため、リデューサーの出力数はキーの数と等しくなります。
コード片:
@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) であるはずです。
誰かがこの振る舞いを説明できますか?
ヴィシャール