Blog de Gonzalo

Mapreduce en php

Hace unos meses hice un curso por internet sobre la introducción a big data y la verdad es que me pareció interesante y escribí sobre hadoop y MapReduce y ahora he creado un ejemplo de mapreduce en php bastante sencillo que me ha servido para entender y espero que os sirva a vosotros:

$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;
	}
///echo '
';var_dump($puntuacion);
$map = map($puntuacion,'name','points');
echo '
';var_dump($map);
$reduce = reduce($map,'name','points');
echo '
';var_dump($reduce);

Sñe 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.