16 marzo, 2008

Incremental Map/Reduce en CouchDB

Damien Katz, el autor de COuchDB, explica como piensa implementar la técnica de Map/Reduce que publicó Google para tratar con cantidades ingentes de datos. Damien Katz: Incremental Map/Reduce y Damien Katz: Incremental Map/Reduce/Combiner?

El ejemplo siguiente crea sus propias operaciones de combinación dentro de la función Reduce. Supongamos que tenemos una base de datos llena de recibos y queremos calcular el total gastado en un mes:

// este sería un recibo de ejemplo

{
"_id":"2DA92AAA628CB4156134F36927CF4876",
"type":"recibo"
"amount":19.95,
"note":"esto funcionara",
"year":2008,
"month":1,
"day":12,
....
"}
}

// a continuación la función Map

function (doc) {
  if (doc.type == "recibo") {
    var key = [doc.year, doc.month];
    emit(key, doc.amount);
  }
}

// y una función Reduce para calcular los totales de los recibos:

function (date, values) {
  var result = {totalSpent:0, numPurchases:0};
  for(var i=0; i<values.length; i++) {
     switch (typeof values[i]) {
     case "number":
       result.totalSpent += values[i];
       result.numPurchases++;
     case "object":
       // este es un objeto, y salida de una reducción anterior
       result.totalSpent += values[i].totalSpent;
       result.numPurchases += values[i].numPurchases;
     }
  }

  return result;

}

// Una vez guardado en un documento de diseño, se pueden obtener los valores de Enero de 2008:
// GET /db/_view/receipts/amount_spent_month?key=[2008,1] //Resultado:

{"total_rows":12,
 "rows":[
   { "key":[2008,1],
     "value": { "totalSpent": 1252.1
                "numPurchases": 13}
   }
 ]
}

Publicar un comentario en la entrada

Últimos links en indiza.com