2013-04-22 85 views
0

我已經成功地使用Mongodb和MapReduce將超過5百萬行的銷售額彙總到60k左右。對結果非常滿意,但是對於結果中的一行感到困惑,因爲結果似乎將結果連接起來而不是總結結果,所以我結束了一個包含「0.00590100000000.00.0059010.133150000000.0053100.002960.043208000.00189」的值字段Mongodb - MapReduce連接值而不是求和

有沒有人遇到過這個?

通過仔細分析原始聲明中涉及的行,我看不到任何會導致它的內容,因爲它們看起來完全一樣。甚至有相同標識符的值已經被彙總。

我的代碼如下,任何人都可以發現任何可能導致它?就像我說的那樣,從520萬原始語句中只有7行,所以精確度相當不錯,它只是沒有發現,我知道它會讓我感到困擾。

mongoimport -d test -c sales --type csv --file sales_rawdata.csv --headerline 

var mapFunction1 = function() { 
         emit({video_id: this.video_id, isrc: this.isrc, country: this.country}, this.amount_payable); 
        }; 


var reduceFunction1 = function(keyIsrc, valuesAmountPayable) { 
         return Array.sum(valuesAmountPayable); 
        }; 

db.sales.mapReduce(
     mapFunction1, 
     reduceFunction1, 
      { out: "sales_total_by_country_and_isrc" } 
       ) 

db.sales_total_by_country_and_isrc.find()   

mongoexport --csv -d test -c sales_total_by_country_and_isrc -q '{value: {$ne: 0}}' -f "_id.video_id","_id.isrc","_id.country","value" -o sales_total_by_country_and_isrc.csv 

回答

1

這可能是您的amount_payable值之一存儲爲字符串。如果是這樣,那麼Array.sum將連接爲一個總和。

您可以測試使用:

db.sales_total_by_country_and_isrc.find({ video_id: <the video_id in question>, 
              isrc: <the isrc in question>, 
              country: <the country in question>, 
              amount_payable: {$type: 2 } 
             }) 

其中$類型:2將檢查字符串類型。

+0

謝謝!看起來這些行在原始數據導入時被存儲爲字符串。那麼我怎樣才能確保什麼時候導入,這些是整數的力量? – Raoot 2013-04-22 17:42:20

+0

嗨瑞安 - 不幸的是,我不認爲有一個選項可以將字符串轉換爲與mongoimport數字。我能想到的唯一方法是在啓動map/reduce之前更新那些amount_payable是字符串的行,或者處理map-reduce中的不同類型,儘管在性能方面可能會很痛苦。 – Kay 2013-04-23 00:47:17

+0

我會給你一個去。如果我可以首先識別字符串的值,然後轉換,我想它會相當快。再次感謝。 – Raoot 2013-04-23 09:29:03