当前位置:  开发笔记 > 编程语言 > 正文

MapReduce返回NaN

如何解决《MapReduce返回NaN》经验,为你挑选了1个好方法。

我有一个M/R函数,我得到NaN作为一些结果的值.我没有任何JS经验.我使用Java驱动程序逃避JS.

String map = "function(){" + " emit({"
            + "country: this.info.location.country, "
            + "industry: this.info.industry}, {count : 1});  }";

String reduce = "function(key, values){var count = 0.0;"
            + "values.forEach(function(v){ count += v['count'];});"
            + "return count;}";
MapReduceOutput output = collection.mapReduce(map, reduce, null,
            new BasicDBObject("lid", "foo"));

一个例子有助于清除事物:

{"_id":{"country":"gb", "industry":"foo"}, "value":NaN}

非常感谢.



1> Niels van de..:

我看到你已经解决了问题,但这就是问题发生的原因.

MongoDB可能会在之前的reduce传递结果上重新运行reduce函数.这称为重新减少.

如果在原始方案中发生重新缩减,则可能会得到如下值:

[
  { count: 1 },
  { count: 1 },
  4
  { count: 1 },
  { count: 1 },
  { count: 1 },
  3
  { count: 1 },
]

所有{ count: 1 }值都由map函数发出.数字43以前减少调用的结果.然后,您的reduce函数将访问数字的count属性:

count += 4["count"];

数字没有count属性,因此它将返回undefined.添加undefined到数字将导致NaN.

要避免这种难以调试的问题,您需要确保reduce函数是幂等的.完成此任务的最简单方法是返回您发出的内容 ; 您在reduce函数中返回的值应与您在map函数中发出的值具有相同的格式.

推荐阅读
手机用户2502852037
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有