0

二相行列乗算を実装しています。次の部品は、第 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) であるはずです。

誰かがこの振る舞いを説明できますか?

ヴィシャール

4

1 に答える 1

0

Iterableその効果を引き起こす可能性のある実装方法があります。

意図は、各iterator()呼び出しが独自のIteratorインスタンスを返す必要があることのようです。によって使用されるプライベートクラスを含む、のIterableクラスはすべてそうします。その動作は、同じ上のネストされたforeachに必要であり、指定された目的はforeachサポートです。java.utilListArrays.asList()IterableIterable

Iterableその動作を直接必要とするAPIドキュメントには何も見つかりません。

明らかに、2つのiterator()呼び出しの結果として同じオブジェクトが使用された場合、同じオブジェクトにネストされたforeachステートメントは、Iterable説明した方法で失敗します。

================================================== =======

これが起こっている場合、私の最善の提案は、各テキスト参照をのようなvalues行儀の良いものにコピーすることを最初にパスすることです。その要素に対してネストされたループを安全に実行できます。List<Text>ArrayList

于 2013-03-13T03:24:18.007 に答える