2015-07-01 2 views
6

Я получаю сообщение об ошибке при попытке уменьшить DISTINCT, которое я получил от here. Я воспроизвел эту ошибку на ведре с образцом пива, поэтому это должно быть легко воспроизвести. Я не видел никаких ошибок в файле mapreduce_errors.txt или что-нибудь, что могло бы привести меня в других местах. (Если вы хотите, чтобы я искал или отправлял фрагменты других файлов, пожалуйста, спросите).Ошибка (Reducer:) при попытке сделать отчетливое уменьшение

Запуск предприятия couchbase 4 beta, на Windows 2008 R2 (это также произошло и в сообществе 3.0.1.).

Вот моя функция карты (используя ведро для пива, которое поставляется непосредственно с кушеткой).

function(doc, meta) { 
    switch(doc.type) { 
    case "brewery": 
    emit(meta.id); 
    break; 
    } 
} 

Вот моя уменьшить функция:

function(keys, values, rereduce) { 
    return keys.filter(function (e, i, arr) { 
    return arr.lastIndexOf(e) === i; 
    }); 
} 

Это ошибка:

reason: error (Reducer:)

Тоже Imgur на странице просмотра, если это поможет: http://i.imgur.com/KyLutMc.png

ответ

1

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

По Couchbase documentation:

The base format of the reduce() function is as follows:

function(key, values, rereduce) { 
    ... 
    return retval; 
} 

The reduce function is supplied three arguments:

key : The key is the unique key derived from the map() function and the group_level parameter.

values : The values argument is an array of all of the values that match a particular key. For example, if the same key is output three times, data will be an array of three items containing, with each item containing the value output by the emit() function.

rereduce : The rereduce indicates whether the function is being called as part of a re-reduce, that is, the reduce function being called again to further reduce the input data.

When rereduce is false:

  • The supplied key argument will be an array where the first argument is the key as emitted by the map function, and the id is the document ID that generated the key.

  • The values is an array of values where each element of the array matches the corresponding element within the array of keys .

When rereduce is true:

  • key will be null.

  • values will be an array of values as returned by a previous reduce() function. The function should return the reduced version of the information by calling the return() function. The format of the return value should match the format required for the specified key.

Жирного форматирование мое, и подсвеченные слова очень важны: вы должны учитывать, что иногда вы будете получать keys аргумент со значением null.

Согласно документации, вы должны обрабатывать случай, когда rereduce является true в вашей reduce() функции, и вы должны знать, что в этом случае keys будет null. В случае Вашей reduce() функции, вы могли бы сделать что-то вроде этого:

function(keys, values, rereduce) { 
    if (rereduce) { 
    var result = []; 
    for (var i = 0; i < values.length; i++) { 
     var distinct = values[i]; 
     for (var j = 0; j < distinct.length; j++) { 
     result.push(distinct[j]); 
     } 
    } 
    return result.filter(function (e, i, arr) { 
     return arr.lastIndexOf(e) === i; 
    }); 
    } 

    return keys.filter(function (e, i, arr) { 
    return arr.lastIndexOf(e) === i; 
    }); 
} 

Вот, я в первую очередь обработки фазы повторного снижения. Для этого я сглаживаю массив массивов, которые получаю в аргументе values, а затем я удаляю дубликаты, которые могли появиться после слияния.

Затем наступает исходный код, который возвращает массив аргументов keys без дубликатов.

Чтобы проверить, что это reduce() функция на самом деле работает, я использовал следующую map() функцию:

function(doc, meta) { 
    switch(doc.type) { 
    case "brewery": 
    emit(meta.id, null); 
    emit(meta.id, null); 
    break; 
    } 
} 

Это намеренно создает дубликаты, которые затем удаляются с помощью функции reduce().

+0

[Это сделало нулевое изменение] (http://i.imgur.com/umLy8mE.png). Достаточно сказать, что я попытался исправить «meta.id» как ключ и значение; null и документ как ключ/значение, так и комбинации обоих, а также изменение функции уменьшения для работы с ключом/значением. Все они привели к той же ошибке. – FrankerZ

+0

Как я уже упоминал в своем вопросе, эта ошибка произошла и в версии 3.0.1 community. – FrankerZ

+0

@FrankerZ Пожалуйста, проверьте обновленный ответ. –

0

Хотя это уменьшает работу как вид развития, но не как производственный вид. Набор данных должен быть слишком большим, поэтому вам нужно выполнить повторное использование. Эта документация должна помочь http://docs.couchbase.com/admin/admin/Views/views-writing.html#reduce-functions

+0

Это также не работает, и я использую набор данных образца. Это не может быть так много? – FrankerZ

+0

Предполагается, что у Dev-представлений будет работать с небольшим набором данных, поэтому I –

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