2010-11-21 58 views
2

我使用了Riak存儲JSON文檔現在排序,我想基於一些屬性對它們進行排序,讓我們說有一個關鍵,即如何文檔中使用Erlang的地圖在了Riak減少

{ 「someAttribute」:「whatever」, 「order」:1 }

所以我想根據「訂單」對文檔進行排序。

我目前正在用erlang界面檢索riak中的文檔。我可以將文檔作爲字符串取回,但在此之後我不知道該怎麼做。我在想這個map函數只是減少了json文檔本身,而在reduce函數中,我會檢查一下,看看我正在查看的項目是否具有比其餘部分更高的「順序」列表,如果是這樣附加到開頭,然後返回一個列表:反向。

儘管我的想法如上所述,在幾乎整整一天之後,我已經得到了零結果,但我對於erlang接口在riak中很困惑。有人可以提供關於如何編寫這個map/reduce函數的見解,或者只是如何解析json文檔?

回答

1

據我所知,您無權訪問地圖中的輸入列表。您從Map中將文檔發送爲1個元素列表。

輸入(所有文檔處理爲{Bucket,Key}) - > Map(處理單個文檔) - > Reduce(從Map發出的整個列表)。

地圖在許多節點上按每個doc執行,而Reduce在所謂的協調節點(調用查詢的節點)上完成一次。

解決方案:

  1. 定義輸入(作爲列表或桶)
  2. 檢索值在地圖和發射整個文件或{ID,Val_to_sort_by)
  3. 排序中降低(使用規則列表:keysort )
+0

我有點困惑,在riak/java腳本的例子中,他們可以做到這一點。 函數(value,keyData,arg)var data = Riak。mapValuesJson(值)[0]; if(data.High && data.High> 600.00) return [value.key]; else return []; } 所以他們得到他們在var數據中看到的任何東西。 然後他們做一個數據。就好像它是一個屬性。我想這取決於 他們甚至如何將文檔放在首位。我不能爲訂單做同樣的事嗎? (不是您所說的「輸入」部分) – user436605 2010-11-22 15:58:34

+0

在給出的示例中,該語句用於過濾映射階段中的數據。排序不能在地圖階段完成,因爲它一次只能處理一條記錄。 – 2012-12-14 12:56:16

0

這不是地圖縮小解決方案,但您應該檢出Riak Search

+0

你能解釋一下riak搜索會如何幫助我嗎?它看起來像是'更有效的機制來標記項目,以便我可以稍後檢索它們。他們的erlang API示例是 搜索:搜索(<<"books">>,<<作者:joyce >> >>)。 所以我可以找到搜索桶書籍,說一個JSON文檔與一個關鍵「作者」和一個值「joyce」。我的問題是我需要根據特定的屬性進行排序。如何將riak搜索做到這一點? – user436605 2010-11-22 16:18:38

0

所以我「解決了」使用javascript的問題,仍然無法使用erlang來完成。 這裏是我的查詢

{"inputs":"test", 
"query":[{"map":{"language":"javascript", 
        "source":"function(value, keyData, arg){ var data = Riak.mapValuesJson(value)[0]; var obj = {}; obj[data.order] = data; return [ obj ];}"}}, 
     {"reduce":{"language":"javascript", 
        "source":"function(values, arg){ return [ values.reduce(function(acc, item){ for(var order in item){ acc[order] = item[order]; } return acc; }) ];}", 
        "keep":true}} 
     ] 
} 

所以在map階段,我要做的就是創建一個新的數組,OBJ,關鍵的順序和值數據本身。所以在視覺上,該obj是這樣

{"1":{"firstName":"John","order":1} 
在簡化階段

,我只是把它在蓄壓器,所以基本上這就是那種,如果你仔細想想,因爲當你做,一切都會爲了你而放置。所以我把2個JSON文件進行測試,一個是上面的ohter只是姓:比利,爲了2,這裏是我的查詢結果上述

[{"1":{"firstName":"John","order":1},"2":{"firstName":"Billie","order":2}}] 

所以它的作品! 。但我仍然需要在ERLANG中做到這一點,有什麼見解?

+0

您正在做的是從自我排序結構的地圖部分返回 - 但僅從JS VM的角度來看。在Erlang中,我沒有看到相同的結果(你需要有整個結構並添加元素以保持排序)。也許產生一個進程並在排序的ETS集中保存一個值? – user425720 2010-11-23 10:50:45

+0

(Spawn需要避免vnodes上的死鎖) – user425720 2010-11-23 10:56:46

+0

更多細節:在調用M/R之前創建公共排序的ETS表。將名稱/編號傳遞給地圖。在每個映射表中保存值。在減少,只是檢索數據。甚至可以跳過減少 - 你可以使用表ID來稍後獲取數據。從Erlang的角度來看,這不是最好的解決方案,因爲它提供了全局狀態(ETS),但它可能很方便。 – user425720 2010-11-23 11:11:32