0

mongo を使用してプログレッシブ マップ削減タスクを実行するという複雑な動作が見られます。入力コレクションは、以下を含むドキュメントの大規模なセットです。

{_id: , url: 'おしゃれなサイトの URL'}

これが私の単純なマップ関数です:

    map: function() {

        emit(this.url, {count: 1, id: this._id});

    }

そしてreduce(以下に示すログのデバッグ出力がたくさんあります):

    reduce: function (key, values) {
        var count = 0;
        var lastId = null;
        var first = null;

        if (typeof values[0].id == "undefined") {
            print("bad id");
            printjson(key);
            printjson(values[0]);
            return null;
        } else {
            print ("good id");
            printjson(key);
            printjson(values[0]);
        }

        first = ObjectId(values[0].id).getTimestamp();

        values.forEach(function(v) {

            count += v.count;

            last = ObjectId(v.id).getTimestamp();

            lastId = v.id;

        });

        return {
            count: count, 
            first: first, 
            last: lastId, 
            lastCounted: lastId
        };
    }

mapreduce を呼び出す方法は次のとおりです。

        mrparams.out = {reduce: this.output};
        mrparams.limit = 100;

        mrparams.query = {'_id': {'$gt': mongoId(lastId.toHexString())}};
                    mrparams.finalize = null;


        mrdb.mapReduce(this.map, this.reduce, mrparams, function(d) {
            console.log("Finished mr", d);
            callback();
        });

これはcronタイプの方法で行われるため、時間間隔ごとに、ジョブは、前回実行されたlastIdののレコードから始まる制限数のレコードで実行されます。

非常に基本的なインクリメンタル マップは、ものを減らします...

しかし、それを実行すると、reduce メソッドの戻り値が reduce メソッドに渡されていることがわかります。ログのスナップショットは次のとおりです。

XXXgood id " http://www.nytimes.com/2013/04/23/technology/germany-fines-google-over-data-collection.html " { "count" : 1, "id" : ObjectId("5175a065b25f029a1d0927e6 ") }

良い ID " http://www.nytimes.com/2013/04/23/world/middleeast/israel-hagel-iran.html " { "count" : 1, "id" : ObjectId("5175a065d7f115dd41097df6") }

良い ID " http://www.nytimes.com/interactive/2013/04/22/sports/boston-moment.html " { "count" : 1, "id" : ObjectId("5175a0657c9c963654094d25") }

YYYThu Jun 20 11:42:11 [conn19938] query vox.system.indexes query: { ns: "vox.tmp.mr.pi_analytics_spark_trending_inventories_6667_inc" } nreturned:1 reslen:131 0ms Thu Jun 20 11:42:11 [conn19938]クエリ vox.tmp.mr.pi_analytics_spark_trending_inventories_6667 nreturned:9 reslen:1716 0ms

ZZZbad id " http://www.nytimes.com/2013/04/22/business/comedy-central-to-host-comedy-festival-on-twitter.html " { "count" : 2, "first" : ISODate("2013-04-22T20:41:11Z"), "last" : ObjectId("5175a067b25f029a1d092802"), "lastCounted" : ObjectId("5175a067b25f029a1d092802") }

悪い ID " http://www.nytimes.com/2013/04/22/business/media/in-boston-cnn-stumbles-in-rush-to-break-news.html " { "count" : 7, "first": ISODate("2013-04-22T20:41:09Z"), "last": ObjectId("5175a067d7f115dd41097e3c"), "lastCounted": ObjectId("5175a067d7f115dd41097e3c") }

XXX - map 関数から出力された一連のレコード (count と id の値を含む) YYY - ZZZ に慣れていなくても、ある種の mongo - イベントの後、前の reduce ジョブの出力で reduce が呼び出されます...

TLDR、map reduce を実行すると、mongo プロセスが実行されるまで縮小がうまくいき、reduce 関数に渡された以前の reduce 関数の戻り値が表示され始めます。

なぜ/どのようにこれが可能か考えていますか?

実行中のmongo 2.0.6

前もって感謝します

4

1 に答える 1

0

状況が分かりました。map reduce ジョブの出力を既存のコレクションに入れる場合、mongo は、新しく縮小されたドキュメントと、同じキーを持つ出力コレクションに既にあったドキュメントの両方を reduce 関数を介して渡します。

map から出力する値と reduce から返す値に一貫した形式がある場合、これはシームレスに機能します。

これは十分に文書化されていませんが、私のフラストレーションが賢さの感覚に変わったことを理解した今. 痛ましい教訓を学んだ。良い時代が待っています。

于 2013-06-20T20:35:31.157 に答える