1

我有一个超级简单的 map reduce 测试......它无法始终如一地工作。简而言之,我只是在寻找重复的记录。我有一个集合:

GiftIdea - site_id - site_key

site_id + site_key 应该是唯一的,但目前不是。所以我有以下地图减少代码:

var map = function() { 
   print(this.site_key); 
   emit(this.site_id + this.site_key, 1);
};
var reduce = function(key,values) { 
   var sum=0;
   for(var i in values){ 
      print(key + ": " + ++sum); 
   } 
   return sum; 
};

使用此输入数据:

GiftIdea
-site_id:亚马逊-site_key:2 -site_id:亚马逊-site_key:2
-site_id:亚马逊-site_key:1

所以我应该得到:

亚马逊1 => 2 亚马逊2 => 1

这是我运行它时发生的情况

> o = db.gift_ideas.mapReduce(map,reduce)                                                                        
{
    "result" : "tmp.mr.mapreduce_1283015268_136",
    "timeMillis" : 5,
    "counts" : {
        "input" : 3,
        "emit" : 3,
        "output" : 2
    },
    "ok" : 1,
}

好的,好消息,我已经发出 3 行,并输出 2。但我得到:

亚马逊1 => 1.00000 亚马逊2 => 1.00000

在我的日志文件中,我有:

8 月 28 日星期六 13:22:50 [conn582] CMD:删除 personalizr_test.tmp.mr.mapreduce_1283016170_139 8 月 28 日星期六 13:22:50 [conn582] CMD:删除 personalizr_test.tmp.mr.mapreduce_1283016170_139_inc 1 2 1

键:amazon1 值:2 8 月 28 日星期六 13:22:50 [conn582] 在 {0:1} 上为 personalizr_test.tmp.mr.mapreduce_1283016170_139_inc 建立新索引 8 月 28 日星期六 13:22:50 [conn582] Buildindex personalizr_test.tmp。 mr.mapreduce_1283016170_139_inc idxNo:0 { ns: "personalizr_test.tmp.mr.mapreduce_1283016170_139_inc", key: { 0: 1 }, name: "0_1" } Sat Aug 28 13:22:50 [conn582] done for 2 records 0secs Sat 8 月 28 日 13:22:50 [conn582] 在 {_id:1} 上为personalizr_test.tmp.mr.mapreduce_1283016170_139 构建新索引 8 月 28 日星期六 13:22:50 [conn582] Buildindex personalizr_test.tmp.mr.mapreduce_1283016170_139 idxNo:0 {姓名:“身份证", ns: "personalizr_test.tmp.mr.mapreduce_1283016170_139", key: { _id: 1 } } Sat Aug 28 13:22:50 [conn582] done for 0 records 0secs Key: amazon1 Values: 1 Key: amazon2 Values: 1 8 月 28 日星期六 13:22:50 [conn582] CMD:删除personalizr_test.tmp.mr.mapreduce_1283016170_139_inc 8 月 28 日星期六 13:22:50 [conn582] CMD:删除personalizr_test。所有想法按键分组 8 月 28 日星期六 13:22:50 [conn582] 端连接 127.0.0.1:56135

1、2、1 表示地图功能正常工作。这是正确顺序的正确项目,但 reduce 函数看起来很奇怪。我两次为 amazon1 调用 reduce,第二次,值不正确。另一件事是,在第一次调用之后,mongo 正在创建一个索引。我猜它等待第一个数据,以确定数据格式将是什么,因此它可以适当地生成索引。但我不明白为什么我接到电话:键:amazon1 值:1 电话

有什么建议么?

其他一些有趣的花絮: mongo 1.6.1 mongoid 2.0.0.beta16 bson 1.0.4 bson_ext 1.0.4

真正特别的一件事是 tt 在一个包含真实数据的不同数据库上工作!

以下是填充数据库中的记录之一:

{ "_id" : ObjectId("4c69b7164914e54d9b007c34"), "avg_score" : null, "category_ids" : [ ], "created_at" : "Thu Aug 19 2010 05:57:25 GMT-0400 (EDT)", "desc" : null, "enabled" : null, "idea_ratings" : [ ], "images" : [
    {
        "url" : "http://ecx.images-amazon.com/images/I/515cLXdLUNL._SL75_.jpg",
        "_id" : ObjectId("4c69b7164914e54d9b007c35"),
        "height" : 61,
        "width" : 75
    }
], "num_ratings" : null, "owner_id" : null, "price" : -1, "rating_stats" : { "_id" : ObjectId("4c7746877719ad0712000dc8"), "total" : -1, "count" : 1, "average" : -1, "sum_of_weights" : 1 }, "ratings" : null, "response_groups" : [ ], "sales_rank" : 40751, "site_id" : "amazon", "site_key" : "B00001OPJE", "title" : "SNK NEOGEO Pocket Color Console in Platinum Silver", "updated_at" : "Fri Aug 27 2010 21:34:40 GMT-0400 (EDT)", "url" : "http://www.amazon.com/NEOGEO-Pocket-Color-Console-Platinum-Silver/dp/B00001OPJE?SubscriptionId=1VHSF1NEXNWHR2A8BA82&tag=gifter-20&linkCode=xm2&camp=2025&creative=165953&creativeASIN=B00001OPJE" }

这是我的一个样本

{ "_id" : ObjectId("4c7948667719ad410f000005"), "created_at" : "Sat Aug 28 2010 13:33:26 GMT-0400 (EDT)", "enabled" : true, "rating_stats" : { "_id" : ObjectId("4c7948667719ad410f00000d"), "total" : 2, "count" : 2, "average" : 1, "sum_of_weights" : 2 }, "sales_rank" : 10, "site_id" : "amazon", "site_key" : "1", "title" : "title1", "updated_at" : "Sat Aug 28 2010 13:33:26 GMT-0400 (EDT)", "url" : "url1" }

建议?

4

1 回答 1

2

好的,感谢艾略特·霍洛维茨(Eliot Horowitz)。他告诉我我的 reduce 函数不正确。Reduce 可以重新运行,因此您需要执行以下操作:

var reduce = function(key,values) { var sum=0; for(var i in values){ sum += values[i]; 打印(键+“:”+总和);} 返回总和;};

于 2010-08-28T18:00:26.650 回答