2012-06-13 4 views
18

を減らす呼び出すdoesntの一つのキー/値を一つ放ちのMongoDBのMapReduce - だから私は、一般的にMongoDBをし、MapReduceの持つ新たなんだと、この「癖」(または少なくとも私の心に癖)に出くわした

は、私は、オブジェクトを持っていると言います

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

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

{ 'キー' のようなので、私のコレクションで:5、 'value':1}

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

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

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

マイマップ機能は、単にキーを放射し、値

マイ機能を減らすだけで(私は機能を減らすかどうかを確認するためにこれをしなかった1を追加し、それらを返す前の値を追加しますはeです

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

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

)を

私の結果が続くと呼ばVEN

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

あなたが見ることができるように、キーの4 & 5私は11のBUT番目の期待答えを得ますeキー3(そのキーを持つコレクション内の1つのエントリのみ)私は予期しない0を得る!

mapreduceのこの自然な動作は一般的ですか? MongoDBについては? pymongo(これは私が使っている)のために?

答えて

34

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

+9

地図の縮小が設計された方法です。独自のキー(キー3など)を使用してドキュメントを修正する場合は、finalize関数の使用を検討してください。http://www.mongodb.org/display/DOCS/MapReduce#MapReduce-FinalizeFunction – Jenna

+3

結果の単一の文書のキー??? –

+1

@RaviKhakhkhar単一のドキュメントが結果に含まれているだけで、reduce関数は呼び出されません – Cilvic

0

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

はい。

+9

いいえ - これは一般的なMRのための自然ではありません。元のMR紙もHadoop Map Reduceもこれを行いません。その「1」をレデューサーの別のタイプに変換することもできます。だから一般的に減速機をスキップすることはかなり悪い/奇妙な考えであろう;-)これはmongoのMRがそれをしないということを意味するのではなく、 "期待される行動_一般的な"ではない。 –

+0

ここでhttp://docs.mongodb.org/manual/tutorial/troubleshoot-reduce-function/ Mongoはretuceは同じ型マップの価値を返さなければならないと言います。しかし、私はそれが悪い、奇妙な、予期しない、不明であることに同意します。 – amorfis

4

私は、これは古い質問です実現が、私はそれに来て、この動作が存在し、どのようにそれは非の問題ですので、機能を減らす/マップを構築するために、なぜ私はまだ理解していなかったように感じました。

MongoDBがキーのインスタンスが1つしかない場合、MongoDBがreduce関数を呼び出さないのは、必要ではないからです(これは一瞬で意味をなされることを望みます)。 requirements for reduce functionsれる次

  • マップ関数によって放出された値の型と同じである必要があり、その型のオブジェクトを返す必要があり機能を低下させます。
  • valuesArrayの要素の順序は、reduce関数の出力に影響しません。
  • reduce関数は冪等でなければなりません。

最初の要件は非常に重要であり、私がその後、ファイナライズ機能でシングルキーケースを扱う減らす機能の人々のマッピングの数を見てきたので、人の数がそれを見下ろすされているようです。しかし、これは問題を解決するための間違った方法です。

次のように考えてみましょう。キーのインスタンスが1つだけの場合、簡単に最適化すると減速器を完全にスキップできます(削減するものはありません)。単一キーの値は依然として出力に含まれていますが、レデューサーの意図はコレクション内の複数キー文書の集計結果を作成することです。マッパーとレデューサーが同じタイプを出力している場合は、のオブジェクト構造のmap/reduce関数の出力を見ることで、幸せに気づかないといけません。レデューサーを通過しなかったオブジェクトの構造を修正するためにファイナライズ機能を使用する必要はありません。

要するに、マップ関数でマッピングを行い、複数のキーの値をreduce関数の集計結果にまとめます。

3

ソリューション:シングル::このフィールドに変化を低減に0

  • :シングル:

    • マップに新しいフィールドを追加で1
    • は、このためにチェックメイクを完成しますフィールドを実行して必要な操作を行う

      $map = new MongoCode("function() { 
          var value = { 
           time: this.time, 
           email_id: this.email_id, 
           single: 0 
          }; 
      
          emit(this.email, value); 
      }"); 
      
      $reduce = new MongoCode("function(k, vals) { 
      
          // make some need actions here 
          return { 
           time: vals[0].time, 
           email_id: vals[0].email_id, 
           single: 1 
          }; 
      }"); 
      
      $finalize = new MongoCode("function(key, reducedVal) { 
          if (reducedVal.single == 0) { 
           reducedVal.time = 11111; 
          } 
          return reducedVal; 
      };"); 
      
  • 関連する問題