2016-09-22 68 views
0

我想使用javascript在Riak DB中對數據執行MapReduce作業。但是一開始就陷入困境,我無法理解它是如何迴歸價值的。Riak MapReduce在使用javascript和python的單節點中

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中包含五組數據。 我認爲map()返回單個值,但它返回的數組有5個值,我認爲相當於RiakDB中的五組數據。

1 
1 
1 
1 
1 

而這裏,爲什麼我只能返回數組?它會獨立處理每個數據集,併爲每個數據集返回。所以我認爲我有五個1。由於這個原因,當我在map()中處理提取的數據時,返回給我提供了意想不到的結果。

所以請給我一些建議。我認爲這是基本的東西,但我無法得到它。我非常感謝你的幫助。

回答

1

當您運行MapReduce作業時,映射階段代碼被髮送到存儲數據併爲數據中的每個值執行的vnodes。得到的數組被收集並傳遞到單個reduce階段,該階段還返回一個數組。如果有足夠多的結果,減少階段可能會運行多次,前一個減少結果和一批地圖結果作爲輸入。

你得到5個結果的事實意味着你的存儲桶中有5個密鑰。地圖階段函數的實例之間沒有全局狀態共享,因此每個狀態都有獨立的i,這就是爲什麼每個結果都是1

你可以嘗試返回[v.key],讓你有獨特的每一個東西,或者如果值預計是小,你可以返回[JSON.stringify(v)],所以你可以看到,被傳遞到地圖的整個結構。

您應該注意,根據docs site javascript Map Reduce已被正式棄用,因此您可能希望使用Erlang函數進行新的開發。