2015-07-01 9 views
6

Ich erhalte einen Fehler beim Versuch, eine DISTINCT zu reduzieren, die ich von here bekommen habe. Ich habe diesen Fehler am Bierprobeneimer reproduziert, so dass dieser leicht reproduzierbar sein sollte. Ich habe keine Fehler in der Datei mapreduce_errors.txt oder irgendetwas gesehen, das mich irgendwo in den anderen führen würde. (Wenn Sie möchten, dass ich die Schnipsel anderer Dateien suche oder posten kann, fragen Sie bitte).Fehler (Reducer:) beim Versuch, deutlich zu reduzieren

Running Couchbase Enterprise 4 Beta, auf Windows 2008 R2 (Dies geschah auch auf der Community-Version 3.0.1.).

Hier ist meine Kartenfunktion (Verwendung des Bierprobeneimers, der direkt mit couchbase geliefert wird). Hier

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

ist meine reduzieren Funktion:

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

Dies ist der Fehler:

reason: error (Reducer:)

Auch ein Imgur der Ansichtsseite, wenn es hilft: http://i.imgur.com/KyLutMc.png

Antwort

1

Das Problem liegt in Ihrer benutzerdefinierten Reduce-Funktion: Sie nicht den Fall behandeln, wenn es als Teil einer Reduce aufgerufen wird.

Per 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.

Bold Formatierung ist mein, und die markierten Wörter sind ganz wichtig: Sie, dass manchmal in Betracht ziehen sollten, werden Sie das keys Argument mit einem Wert von null erhalten.

die Dokumentation nach, sollten Sie den Fall behandeln, wenn rereducetrue in Ihrer reduce() Funktion ist, und Sie sollten in diesem Fall wissen, dass keysnull sein wird. Im Falle Ihrer reduce() Funktion, können Sie etwas tun:

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; 
    }); 
} 

Hier bin ich Umgang zunächst die Wieder reduzieren Phase. Dafür verflach ich das Array von Arrays, die ich im values-Argument empfange, und dann entferne ich die Duplikate, die nach der Zusammenführung aufgetreten sein könnten.

Dann kommt Ihr ursprünglicher Code, der das keys Argumentarray ohne Duplikate zurückgibt.

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

Dies erzeugt absichtlich Duplikate, die dann durch die reduce() Funktion entfernt werden:

Um zu testen, dass diese reduce() Funktion tatsächlich funktioniert, habe ich die folgende map() Funktion verwendet.

+0

[Das machte null Änderung] (http://i.imgur.com/umLy8mE.png). Es genügt zu sagen, ich habe versucht, 'meta.id' als Schlüssel und Wert auszugeben; NULL und das Dokument als Schlüssel/Wert und Kombinationen von beiden, sowie das Ändern der Reduzierungsfunktion, um mit dem Schlüssel/Wert zu arbeiten. Alle haben zu demselben Fehler geführt. – FrankerZ

+0

Wie in meiner Frage erwähnt, ist dieser Fehler auch in der Community-Version 3.0.1 aufgetreten. – FrankerZ

+0

@FrankerZ Bitte überprüfen Sie die aktualisierte Antwort. –

0

Während dieser Reduzieren funktioniert als Entwicklungsansicht, nicht als Produktionsansicht. Der Datensatz muss zu groß sein, sodass Sie die Neuverwendung implementieren müssen. Diese Dokumentation sollte helfen http://docs.couchbase.com/admin/admin/Views/views-writing.html#reduce-functions

+0

Dies funktioniert nicht in beiden, und ich verwende das Beispiel-Dataset. Es kann nicht so groß sein, oder? – FrankerZ

+0

Die Dev-Views sollen gegen einen kleinen Dataset laufen, also habe ich –