映射减少了在计算大对象时存储'Nan'

时间:2012-04-13 08:33:29

标签: python mongodb nosql

地图:

function () { 
emit(this.thread, 
    {max_year:this.date.getFullYear(), 
     min_year:this.date.getFullYear(), 
     max_month:this.date.getMonth(), 
     min_month:this.date.getMonth(),count:1}); 

};

Reduce:
function (key, values) {
max_year= values[0].max_year;
min_year = values[0].min_year;
max_month= values[0].max_month;
min_month = values[0].min_month;
var sum = 0;
if (values.length > 1){
    for(i in values){
        if(values[i].max_year > max_year){
            max_year = values[i].max_year;
        };
        if(values[i].min_year < min_year){
            min_year = values[i].min_year;
        };
        if(values[i].max_month > max_month){
            max_month = values[i].max_month;
        };
        if(values[i].min_month < min_month){
            min_month = values[i].min_month;
        };
        sum+=values[i].count
    };
};

return {"max year":max_year, "min year":min_year, "max month":max_month, "min month":min_month, "No of posts": sum};
}
};

输出:

{u'_id': u'Sujet  Top 5 TED POST', u'value': {u'No of posts': 8.0, u'min month': 0.0, u'max month': 6.0, u'max year': 2011.0, u'min year': 2010.0}}
{u'_id': u'Sujet  Top 5 des meilleurs guitaristes de lhistoire du Rock', u'value':       {u'No of posts': 42.0, u'min month': 2.0, u'max month': 10.0, u'max year': 2011.0, u'min year': 2009.0}}
{u'_id': u'Sujet  Top ALEJANDRO GONZALEZ INARRITU', u'value': {u'No of posts': 29.0, u'min month': 0.0, u'max month': 9.0, u'max year': 2011.0, u'min year': 2008.0}}
{u'_id': u'Sujet  Top ANDY et LARRY WACHOWSKY', u'value': {u'No of posts': 40.0, u'min month': 0.0, u'max month': 11.0, u'max year': 2011.0, u'min year': 2008.0}}
{u'_id': u'Sujet  Top BRYAN SINGER', u'value': {u'No of posts': 50.0, u'min month': 0.0, u'max month': 11.0, u'max year': 2011.0, u'min year': 2006.0}}
{u'_id': u'Sujet  Top Cinma 2010', u'value': {u'No of posts': nan, u'min month': None, u'max month': None, u'max year': None, u'min year': None}}
{u'_id': u'Sujet  Top Cinma 2011', u'value': {u'No of posts': nan, u'min month': None, u'max month': None, u'max year': None, u'min year': None}}

正如你所看到的,对于某些领域(&#34; no of posts&#34;),它打印出了&#39; Nan&#39;和非其他领域。当我使用Map Reduce来计算帖子数而不尝试处理时间戳时,就不会发生这种情况。我还注意到,当#&#34;没有帖子&#34;很大(约1000左右)。 此外,没有&#39;计数&#39;和&#39;总和&#39;最大年份,最小年份和月份的所有操作都很好。  谢谢。

1 个答案:

答案 0 :(得分:2)

你的reduce函数需要以与emit()的第二个参数相同的格式返回一个值 - 由于MongoDB Map-Reduce的工作方式,reduce函数的结果可以传入以再次减少。我怀疑这是nanNone的来源。具体来说,您只需要调整从reduce中返回的对象中的键名称:例如,而不是"max year"(在reduce中),您应该使用max_year

有关编写正确的地图和缩小功能的更多信息,请参阅the MongoDB Map-Reduce documentation