2012-11-07 42 views
0

我有一個4個riak節點加載數據的集羣。我正在嘗試執行一個簡單的MapReduce作業,但是我試圖通過提供自己的javascript函數(爲了移動到更多涉及MapReduce作業)來完成作業。Riak MapReduce Javascript奇怪的輸出

我相關的Java代碼是:

IndexQuery iq = new IntRangeQuery(IntIndex.named(indexId), bucketId, 11, 40); 
Function mapfunc = new JSSourceFunction(
    streamToString(MapReduceDriver.class.getResourceAsStream("/map_1.js"))); 
Function redfunc = new JSSourceFunction(
    streamToString(MapReduceDriver.class.getResourceAsStream("/reduce_1.js"))); 
PBMapReduceResult result = (PBMapReduceResult) riakClient.mapReduce(iq) 
      .addMapPhase(mapfunc) 
      .addReducePhase(redfunc) 
      .execute(); 

當兩個JavaScript功能是:

function map_keepAttr(value, keyData, arg) { 
    var data = Riak.mapValuesJson(value)[0]; 
    return [ data.Attribute_17 ]; 
} 

function reduce_aggregate(values, arg) { 
    return [values.length]; 
} 

我看到的問題是:有是所生產的正是30個值我查詢和地圖階段。但減少階段報告3而不是30(因此不能正確計數)。更奇怪的是,當我使用以下reduce函數時:我得到了預期的結果,即包含正好30個條目的json數組。

任何幫助都會救我,因爲我似乎沒有得到Riak中的MapReduce如何工作。

謝謝!

回答

1

我懷疑你所看到的問題可能是由於沒有考慮你的縮減階段函數中的重新減少而造成的。雖然地圖相位函數每個記錄執行一次,但減少相位函數不一定會在全部數據集作爲輸入執行一次,而是在地圖相位輸出的部分上執行,而不是一直執行一次,直到處理完所有記錄爲止。第一次運行reduce函數所產生的結果將包含在發送到下一個調用的數組中。

爲了使用reduce函數來統計項目的數量,您需要能夠從映射階段輸入中區分以前的reduce函數的結果,或者確保它們具有相同的格式並且可以正確聚合,而不管數據來自哪裏。

+0

你發現問題到底是什麼!一旦我添加了重新減少的邏輯(即佔了不同的格式),一切都像魅力一樣工作!謝謝! – gpol