Mongodb Mapreduce возвращает противоречивые результаты - PullRequest
1 голос
/ 28 августа 2010

У меня есть супер простой тест уменьшения карты ... который не работает последовательно. Короче говоря, я просто ищу дубликаты записей. У меня есть коллекция, которая имеет:

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: amazon -site_key: 2 -site_id: amazon -site_key: 2
-site_id: amazon -site_key: 1

Итак, я должен получить:

amazon1 => 2 amazon2 => 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. Но я получаю:

amazon1 => 1,00000 amazon2 => 1,00000

В моем лог-файле у меня есть:

Сб 28 августа 13:22:50 [conn582] CMD: drop personalizr_test.tmp.mr.mapreduce_1283016170_139 Сб 28 августа 13:22:50 [conn582] CMD: отбросить personalizr_test.tmp.mr.mapreduce_1283016170_139_inc 1 2 1

Ключ: amazon1 Значения: 2 сб 28 августа 13:22:50 [conn582] строит новый индекс {0: 1} для personalizr_test.tmp.mr.mapreduce_1283016170_139_inc Сб 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", ключ: {0: 1}, имя: "0_1"} сб. авг 28 13:22:50 [conn582] сделано для 2 records 0secs Sat 28 августа 13:22:50 [conn582] создание нового индекса для {_id: 1} для personalizr_test.tmp.mr.mapreduce_1283016170_139 Сб 28 авг 13:22:50 [conn582] Buildindex personalizr_test.tmp.mr.mapreduce_1283016170_139 idxNo: 0 {name: " id ", нс: "personalizr_test.tmp.mr.mapreduce_1283016170_139", ключ: {_id: 1}} сб 28 августа 13:22:50 [conn582] сделано для 0 записей 0сек Ключ: amazon1 Значения: 1 Ключ: amazon2 Значения: 1 сб 28 августа 13:22:50 [conn582] CMD: падение personalizr_test.tmp.mr.mapreduce_1283016170_139_inc Сб 28 августа 13:22:50 [conn582] CMD: отбросьте personalizr_test.All идеи сгруппированы по ключу сб 28 августа 13:22:50 [conn582] конец соединения 127.0.0.1:56135

1, 2, 1 указывает на то, что функция карты работает правильно. Это правильные элементы в правильном порядке, но функция сокращения выглядит странно. Я дважды вызываю уменьшение для amazon1, и во второй раз значение неверно. Другое дело, что после первого вызова mongo создает индекс. Я предполагаю, что он ждет первых данных, чтобы выяснить, какими будут форматы данных, чтобы он мог генерировать индекс соответствующим образом. Но я не понимаю, почему мне звонят Ключ: amazon1 Значения: 1 звонок

Есть предложения?

Несколько других интересных моментов: монго 1.6.1 mongoid 2.0.0.beta16 бсон 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" }

Предложения

1 Ответ

2 голосов
/ 28 августа 2010

Хорошо, спасибо Элиоту Горовицу на этот раз.Он сказал мне, что моя функция снижения была неправильной.Reduce может быть перезапущен, поэтому вам нужно сделать что-то вроде:

var redu = функция (ключ, значения) {var sum = 0;for (переменная i в значениях) {sum + = values ​​[i];печать (клавиша + ":" + сумма);} возврат суммы;};

...