MAPREDUCE EN PHP: QUÉ ES Y CÓMO IMPLEMENTARLO

MapReduce es un modelo de programación y una infraestructura asociada para el procesamiento de grandes volúmenes de datos en clústeres de computadoras. Aquí está una explicación detallada: Concepto de MapReduce:
  • Map: Esta fase toma un conjunto de datos y los convierte en otro conjunto de datos, donde los elementos individuales están desglosados en pares clave-valor. La función "map" procesa cada elemento de entrada de forma independiente, transformándolo en uno o más pares clave-valor.
  • Reduce: Esta fase toma los pares clave-valor generados por la fase Map y los combina de alguna manera, generalmente mediante la agrupación por clave y luego aplicando una función reductora a todos los valores asociados con la misma clave.
Ventajas:
  • Escalabilidad: Puede manejar grandes cantidades de datos distribuyendo el procesamiento entre múltiples nodos en un clúster.
  • Simplicidad: Abstrae la complejidad del manejo distribuido de datos y la programación paralela.
  • Tolerancia a fallos: Si un nodo falla durante el procesamiento, MapReduce puede redistribuir la carga de trabajo.
Implementaciones:
  • Hadoop: Es quizás la implementación más conocida de MapReduce, utilizada en el ecosistema de big data.
  • Google's MapReduce: La versión original, aunque no está disponible públicamente, inspiró muchas de las implementaciones posteriores.
MapReduce ha sido en gran medida reemplazado o complementado por sistemas más modernos como Apache Spark, que ofrecen más flexibilidad y eficiencia para ciertos tipos de computación, pero sigue siendo un concepto fundamental en la historia y práctica del procesamiento de datos a gran escala.

$puntuacion = [
	  [ 'name' => 'Pablo', 'date' => '2017-01-01', 'points' => 3]
	, [ 'name' => 'Ángel', 'date' => '2017-01-01', 'points' => 2]
	, [ 'name' => 'María', 'date' => '2017-01-01', 'points' => 4]
	,[ 'name' => 'Pablo', 'date' => '2017-01-01', 'points' => 8]
	, [ 'name' => 'Ángel', 'date' => '2017-01-01', 'points' => 12]
	, [ 'name' => 'María', 'date' => '2017-01-01', 'points' => 6]
	,[ 'name' => 'Pablo', 'date' => '2017-02-01', 'points' => 20]
	, [ 'name' => 'Ángel', 'date' => '2017-02-01', 'points' => 15]
	, [ 'name' => 'María', 'date' => '2017-02-01', 'points' => 18]
	,[ 'name' => 'Pablo', 'date' => '2017-03-01', 'points' => 13]
	, [ 'name' => 'Ángel', 'date' => '2017-03-01', 'points' => 20]
	, [ 'name' => 'María', 'date' => '2017-03-01', 'points' => 18]
];

	//función map y filter
	function map($arr,$indice_principal,$indice){

		$arr_map = array();
		$total = count($arr);
		for($i=0;$i<$total;$i++)
		{
			$arr_map[$i][$indice_principal] = $arr[$i][$indice_principal];
			$arr_map[$i][$indice] = $arr[$i][$indice];
		}
		return $arr_map;
	}
	
	//realiza el reduce para calcular el resultado final	
	function reduce($arr_map,$indice_principal,$indice)
	{
	   	$resultado = 0;
		$arr_reduce = array();
		$total = count($arr_map);
		for($i=0;$i<$total;$i++)
		{
			if (!array_key_exists($arr_map[$i][$indice_principal],$arr_reduce))
			{
				$arr_reduce[$arr_map[$i][$indice_principal]] = 0;
			}
			else
			{
				$arr_reduce[$arr_map[$i][$indice_principal]] += $arr_map[$i][$indice];
			}
			
		}

	    return $arr_reduce;
	}

Se que tendría que haber usado clases y que el código fuese más elegante pero lo que he querido es que fuese sencillo de leer y entender. En el ejemplo anterior se ha usado un array multidimensional pero php tiene funciones para hacer mapreduce:
  • array_map:Devuelve un array que contiene todos los elementos de después de aplicar la función callback a cada uno de ellos.
  • array_reduce:Aplica iterativamente la función callback a los elementos de array, con el propósito de reducir el array a un solo valor.