8

MongoDB と python で Map Reduce をいじっていて、奇妙な制限に遭遇しました。「本」レコードの数を数えようとしています。レコードが 100 件未満の場合は機能しますが、レコードが 100 件を超えると、何らかの理由でカウントがリセットされます。

これが私のMRコードといくつかのサンプル出力です:

var M = function () {
book = this.book;
emit(book, {count : 1});
}

var R = function (key, values) {
var sum = 0;
values.forEach(function(x) {
sum += 1;
});
var result = {
count : sum 
};
return result;
}

レコード数が 99 の場合の MR 出力:

{u'_id': u'superiors', u'value': {u'count': 99}}

レコード数が 101 の場合の MR 出力:

{u'_id': u'superiors', u'value': {u'count': 2.0}}

何か案は?

4

2 に答える 2

3

関数は、各値を加算するだけでなくreduce、値を合計する必要があります。そうしないと、 a の出力を別の への入力として適切に使用できません。代わりにこれを試してください:count1reducereduce

var R = function (key, values) {
  var sum = 0;
  values.forEach(function(x) {
    sum += x.count;
  });
  var result = {
    count : sum 
  };
  return result;
}
于 2012-11-10T03:55:51.260 に答える
2

エミット数が 100 以上の場合、100 個のエミットが送信され、最初に関数が削減され、次の処理が行われます。

{count: 100}

その後、1 つのエミットのみが残り、reduce 関数とプロセスに送信されます。

{count: 1}

OK、結果は次のとおりです。

[{count: 100}, {count: 1}]

そして、reduce 関数が再び呼び出されます (非常に重要です!)。あなたforeach sum+=1のコードにあるからです。配列には 2 つの要素があるため、結果は になり2ます。

参照: http://www.mongodb.org/display/DOCS/MapReduce#MapReduce-Amoretechnicalexplanation

于 2012-11-10T04:47:51.670 に答える