2013-04-22 36 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