Get it on Google Play

MapReduce con MongoDB

01-06-2015
 

Ya hablamos en pasados posts de MapReduce con Hadoop. En este post explicaré como aplicar este framework de Google para hacer consultas a grandes bases de datos en paralelo con MongoDB.

Como repaso, hacer consultas con MapReduce básicamente se trata de crear dos funciones: Una que va a recorrer toda la tabla y va a generar una clave con una serie de valores y la segunda que por cada clave con sus valores va a devolver el resultado. A la primera función la llamamos función de mapeo y a la segunda de reducción.

Partiremos de la colección ‘albaran’ donde tendremos documentos con líneas de productos parecidos a este:

Map Reduce MongoDB

Map Reduce MongoDB

El objetivo de la consulta será obtener el total de productos en los registros. Con este objetivo definimos la función de mapeo que por cada producto devolverá un array con las apariciones que a ido teniendo:


var mapFunction = function() {
	for (var i = 0; i < this.lineas.length; i++) {
		var key = Object.keys(this.lineas[i])[0];
		var value = {
			subtotal: this.lineas[i][key]
			};

		/* Función emit para agregar un valor a la clave */
		emit(key, value);
		}
	};

Definimos también la función de reducción que por cada clave sumará el conjunto de valores:


var reduceFunction = function(id, countObjVals) {
	reducedVal = { total: 0 };

	for (var i = 0; i < countObjVals.length; i++) {
		reducedVal.total += countObjVals[i].subtotal;
		}

	return reducedVal;
	};

MongoDB permite definir, opcionalmente, una función para finalizar.

Finalmente con las dos funciones definidas podemos invocar mapReduce. En este ejemplo invocamos mapReduce sobre la colección ‘albaran’ y le decimos que la salida la ponga en una colección llamada ‘map_reduce_result’.


db.albaran.mapReduce(
	mapFunction,
	reduceFunction,
	{out:'map_reduce_result'}
	);

Para invocarlo metemos todo el script dentro de un fichero llamado ‘script.js’ y mediante línea de comandos lo lanzamos de la siguiente manera:


mongo -u <miusuario> -p >mipassword> xxx.mongolab.com:61741/mibbdd script.js

Leave a Reply

© Albert Coronado Calzada