2016-09-22 4 views
0

javascriptを使用してRiak DBのデータにMapReduceジョブを実行したいとします。しかし、非常に始まりにこだわって、私はそれが価値をどのように戻しているのか理解できませんでした。javascriptとpythonを使用して単一ノードのRiak MapReduce

client = riak.RiakClient() 
query = client.add('user') 
query.map(""" 
      function(v){ 
       var i=0; 
       i++; 
      return [i]; 
      } 
     """) 

for result in query.run(): 
    print "%s" % (result); 

私は上記の例を確認しました。

ここで、クエリはバケットであり、ユーザーはRiakDBに5つのデータセットを含んでいます。 map()は単一の値を返しますが、5の値を持つ配列を返します。私はRiakDBの5つのデータセットに相当すると思います。

1 
1 
1 
1 
1 

ここで、なぜ私はアレイだけを返すことができますか?それはそれぞれのデータセットを独立して処理し、それぞれを返します。だから私は5つの1を持っていると思う。この理由のため、私はmap()内のデータを取り出して返します。返りは私にとっては予期しない結果をもたらします。

ですのでご提案ください。私はそれが基本的なものだと思うが、私はそれを得ることができなかった。私はあなたの助けに非常に感謝します。

答えて

1

MapReduceジョブを実行すると、マップフェーズコードがデータが格納されているノードに送信され、データ内の各値に対して実行されます。結果の配列は、集められ、配列を返す単一の縮小フェーズに渡されます。十分に多くの結果が存在する場合、減少フェーズは複数回実行されてもよく、前回の結果が減少し、マップ結果のバッチが入力される。

5つの結果が得られたということは、バケツに5つのキーが表示されたことを意味します。マップフェーズ関数のインスタンス間でグローバルな状態は共有されないため、それぞれ独立したiを持ちます。そのため、それぞれの結果は1です。

[v.key]を返すようにして、それぞれにユニークなものがあるか、値が小さいと予想される場合は、[JSON.stringify(v)]を返して、マップに渡される構造全体を確認することができます。

docs site javascript Map Reduceは正式に廃止されましたので、Erlang関数を新しい開発に使用することをお勧めします。

関連する問題