2013-03-03 79 views
0

下面是我想實現的邏輯,但我發現它真的很難想出一個辦法用的MongoDB/Node.js的應用MongoDB的MapReduce的聚集物溶液或合併到替代

Data: country, state, val1 

我需要計算平均值和標準偏差。使用以下公式進行偏差。我檢查了其他的堆棧溢出的職位,但我工作的標準偏差公式是不一樣的:

for each row -> group by country, state 
    mean = sum(val1)/count -> 
for each row -> 
    deviation += Math.pow((val1 - mean), 2) 
for each row -> group by country, state 
    std dev = Math.sqrt(dev/ count) 

問題與偏差需要計算的方式。看起來我需要一個聚合的平均值,然後通過Map reduce計算偏差/標準偏差,我找不到計算方法。任何人都可以提出一種方法來做到這一點

如果這是不可能的,我們有辦法在mongodb中發佈類似於下面的傳統合並查詢的更新語句嗎?我將更新所有行的平均值,並稍後調用Mapreduce作爲偏差/ std開發。

merge into Tbl1 a using 
    (select b.country, b.state, sum(b.val1)/count(b.val1) as mean 
    from Tbl1 b 
    group by b.country, b.state) c 
on (a.country = c.country and 
    a.state = c.state) 
when matched 
then update 
     set a.mean = c.mean 

我是nosql和nodejs的新手,如果你們可以提出解決方案/備選方案,那將是非常好的。

回答

0

是的,使用map-reduce計算標準偏差是非常棘手的,因爲您需要將每個數據值與傳統算法中的平均值進行比較。

看看基於並行計算algorithm此解決方案:https://gist.github.com/RedBeard0531/1886960

+0

再次感謝約翰尼!並行計算算法和github示例只產生與我尋找的傳統std dev邏輯相同的結果! – user1549605 2013-03-03 19:57:24