2016-03-13 3 views
0

У меня странная ситуация с уменьшением карты. Результат не рассматривает все записи, хотя и должен.Mongodb mapreduce недостающие документы

У меня есть коллекция твитов, как показано ниже. У меня 230 документов - мой запрос на созданном году. вот пример

{ 
    "_id" : ObjectId("56e55b52330dfb156547d559"), 
    "message" : "RT @TwitFAKTA: Kiper MU, David De Gea mempunyai ritual unik sebelum bertanding, yaitu memutar lagu-lagu Metallica dengan keras.", 
    "createdyear" : "2016", 
    "handle" : "xxx", 
    "createdtime" : "13:23:33", 
    "searchtopic" : "Metallica", 
    "createdmonth" : "03", 
    "createddate" : "2016-03-13", 
    "user" : "xxx" 
} 

Моя картографическая функция подобна этому. Очень просто: конечным результатом будет количество твитов на тему и месяц.

function(){ 
    emit({topic: this.searchtopic, month: this.createdmonth},1) 
}; 

и здесь функция уменьшения: Я просто подсчитываю количество значений для данного ключа.

function(key,value) { 
    var counter=0; 
    for (var i=0;i<value.length;i++) { 
     counter = counter +1; 
    } 
    return counter; 
}; 

, а затем я создаю mapreduce и сохраняю вывод в коллекции.

db.tweets.mapReduce(map,reduce,{out: "mapreduce_test"}) 

результат заключается в следующем:

{ 
    "result" : "mapreduce_test", 
    "timeMillis" : 6, 
    "counts" : { 
     "input" : 230, 
     "emit" : 230, 
     "reduce" : 4, 
     "output" : 2 
    }, 
    "ok" : 1 
} 

карта сократить работы, но результаты не являются правильными. когда я перечисляю выход из MapReduce я получаю следующее:

{ "_id" : { "topic" : "3 Doors Down", "month" : "03" }, "value" : 2 } 
{ "_id" : { "topic" : "Metallica", "month" : "03" }, "value" : 31 } 

Когда я вручную искать документы, я получаю 228 для Metallica и 2 для 3 Doors Down. Это 230 входов и испускаемых записей.

Так где же другие документы? Что случилось?

Обычно у меня есть процесс, который получает твиты из Twitter и хранит их в mongodb. Таким образом, коллекция всегда становится все больше. Когда я регулярно запускаю задачу mapreduce через cron, я заметил, что она работает некоторое время, а затем внезапно появляются неправильные результаты. Посмотрите:

Sun Mar 13 14:30:02 CET 2016 
running mapreduce for topic: Metallica 
{"name": "Metallica","data":[0, 0, 47.0, 0, 0, 0, 0, 0, 0, 0, 0, 0]} 
running mapreduce for topic: 3 Doors Down 
{"name": "3 Doors Down","data":[0, 0, 2.0, 0, 0, 0, 0, 0, 0, 0, 0, 0]} 
writing output file: /home/uwe/development/highcharts/highcharts_tweets.html 

Sun Mar 13 14:40:02 CET 2016 
running mapreduce for topic: Metallica 
{"name": "Metallica","data":[0, 0, 67.0, 0, 0, 0, 0, 0, 0, 0, 0, 0]} 
running mapreduce for topic: 3 Doors Down 
{"name": "3 Doors Down","data":[0, 0, 2.0, 0, 0, 0, 0, 0, 0, 0, 0, 0]} 
writing output file: /home/uwe/development/highcharts/highcharts_tweets.html 

Sun Mar 13 14:50:02 CET 2016 
running mapreduce for topic: Metallica 
{"name": "Metallica","data":[0, 0, 87.0, 0, 0, 0, 0, 0, 0, 0, 0, 0]} 
running mapreduce for topic: 3 Doors Down 
{"name": "3 Doors Down","data":[0, 0, 2.0, 0, 0, 0, 0, 0, 0, 0, 0, 0]} 
writing output file: /home/uwe/development/highcharts/highcharts_tweets.html 

Sun Mar 13 15:00:02 CET 2016 
running mapreduce for topic: Metallica 
{"name": "Metallica","data":[0, 0, 7.0, 0, 0, 0, 0, 0, 0, 0, 0, 0]} 
running mapreduce for topic: 3 Doors Down 
{"name": "3 Doors Down","data":[0, 0, 2.0, 0, 0, 0, 0, 0, 0, 0, 0, 0]} 
writing output file: /home/uwe/development/highcharts/highcharts_tweets.html 

Количество документов растет, а затем внезапно в 15:00 оно упало. Хотя у меня все еще есть документы в базе данных, я несколько раз проверял их.

Я также запускаю это на второй машине, но с теми же результатами.

У кого-нибудь есть объяснение этого поведения?

Спасибо,

Uwe

ответ

1

Поскольку MongoDB партии уменьшить, вы не можете просто суммируют 1 в вашем уменьшить, вы на самом деле нужно суммировать value[i];

function(key,value) { 
    var counter=0; 
    for (var i=0;i<value.length;i++) { 
     counter = counter + value[i]; 
    } 
    return counter; 
}; 

Допустим, размер партии 100. MongoDB получает прошло 100 значений в первой партии (суммированием до 100), и когда она проходит следующие партии он получает прошло 101 значений (одна с суммой до сих пор + 100 новых значений)

Когда вы суммируете 1 вместо value[i], вы всегда считаете общую сумму из предыдущих партий как 1.

+0

Thank you Joachim. Хм.Я должен думать об этом. Я предполагал, что я всегда получаю 1 перетаскиваемый из значения [i]. Но, вероятно, это неправильно. – uwegeercken

+0

Это был быстрый ответ и правильное решение. и вы даже отформатировали мой текст правильно (я не использовал stackoverflow в течение многих лет). – uwegeercken

+0

@uwegeercken Если ответ помог, вы можете подумать о его продолжении и/или отметить его как отвечая на ваш вопрос. Это поможет другим с подобными проблемами найти решение более легко. –

Смежные вопросы