20

だから私は一般的にmongodbとmapreduceに不慣れで、この「癖」(または少なくとも私の心の中では癖)に出くわしました

コレクションに次のようなオブジェクトがあるとします。

{'キー':5, '値':5}

{'キー':5, '値':4}

{'キー':5, '値':1}

{'キー':4, '値':6}

{'キー':4, '値':4}

{'キー':3, '値':0}

私のマップ関数は、単にキーと値を発行します

私のreduce関数は単に値を追加し、それらを返す前に1を追加します(reduce関数が呼び出されたかどうかを確認するためにこれを行いました)

私の結果は次のとおりです。

{'_id': 3、'値': 0 }

{'_id':4、'値': 11.0}

{'_id':5、'値': 11.0}

ご覧のとおり、キー 4 と 5 については 11 という予想される答えが得られますが、キー 3 については (そのキーを持つコレクション内のエントリが 1 つしかないため) 予想外の 0 が得られます!

これは mapreduce の一般的な自然な動作ですか? MongoDB の場合は? pymongo(私が使用している)の場合は?

4

5 に答える 5

39

reduce 関数は、同じキーを持つドキュメントを 1 つのドキュメントに結合します。map 関数が特定のキーに対して単一のドキュメントを出力する場合 (キー 3 の場合のように)、reduce 関数は呼び出されません。

于 2012-06-13T19:32:43.683 に答える
5

これは古い質問だと思いますが、この動作が存在する理由と、マップ/リデュース機能を構築する方法をまだ理解していないように感じたので、問題ではありません。

キーのインスタンスが 1 つしかない場合に MongoDB が reduce 関数を呼び出さない理由は、それが必要ないからです (すぐに理解できると思います)。reduce 関数の要件は次のとおりです。

  • reduce 関数は、型が map 関数によって発行された値の型と同じでなければならないオブジェクトを返さなければなりません。
  • valuesArray 内の要素の順序は、reduce 関数の出力に影響を与えるべきではありません
  • reduce 関数はべき等でなければなりません。

最初の要件は非常に重要であり、reduce 関数でマッピングし、finalize 関数で単一キーのケースを処理する多くの人を見たので、多くの人がそれを見落としているようです。ただし、これは問題に対処するための間違った方法です。

次のように考えてみてください: キーのインスタンスが 1 つしかない場合、単純な最適化はレデューサーを完全にスキップすることです (削減するものは何もありません)。単一キー値は引き続き出力に含まれますが、リデューサーの目的は、コレクション内の複数キー ドキュメントの集計結果を構築することです。マッパーとリデューサーが同じ型を出力している場合、マップ/リデュース関数からの出力のオブジェクト構造を見て、幸いなことに気付かないはずです。レデューサーを通過しなかったオブジェクトの構造を修正するために、ファイナライズ関数を使用する必要はありません。

つまり、map 関数でマッピングを行い、reduce 関数でマルチキー値を 1 つの集計結果に減らします。

于 2014-02-28T12:46:27.803 に答える
1

「MongoDB は、値が 1 つしかないキーに対して reduce 関数を呼び出しません。values 引数は、キーに「マップ」された値オブジェクトを要素とする配列です。」

http://docs.mongodb.org/manual/reference/command/mapReduce/#mapreduce-reduce-cmd

于 2014-01-29T20:00:33.520 に答える
0

これは mapreduce の一般的な自然な動作ですか?

はい。

于 2012-06-13T19:44:13.390 に答える