Apache Spark 2 : Transformaciones (Map y filter )


filterandmap_sparkRecordemos que las transformaciones son operaciones sobre RDDs que darán como resultado un nuevo RDD, las transformaciones más comunes son las siguientes:

  • Filter: Toma una función que devuelve un nuevo RDD formado por los elementos que pasen una función filtro. Esta función se puede utilizar para limpiar un RDD de entrada, veamos un ejemplo:
public class FilterNamesExample {
	public static void main(String[] args) {
		JavaSparkContext sc = new JavaSparkContext(new SparkConf().setAppName("FilterNamesExample").setMaster("local[3]"));
		List names = Arrays.asList("Alex", "Pedro", "", "Juan", "Pancho", "");
		JavaRDD namesRdd = sc.parallelize(names);
		System.out.printf("Names before filter %d \n", namesRdd.count());
		namesRdd = namesRdd.filter(f->!f.isEmpty());
		System.out.printf("Names after filter %d \n", namesRdd.count());
		sc.close();
	}
}

En el código anterior podemos ver que tenemos una entrada de nombres y algunos de ellos están vacíos, lo cual sería una entrada inválida para nuestro sistema, haciendo uso de la función filter crearemos un rdd nuevo conteniendo solo los valores que son válidos.

  • Map : Toma una función y la aplica a cada elemento del RDD, el resultado de la función será utilizado para crear el nuevo elemento en el nuevo RDD, es importante comprender que el tipo de dato del RDD resultado no debe ser necesariamente del mismo tipo que el RDD de entrada, veamos el siguiente ejemplo:
class Person {
	private String name;
	private String lastName;

	public Person(String name, String lastName) {
		this.name = name;
		this.lastName = lastName;
	}

	//Getters and setters
}

Como vemos tenemos una clase llamada Person que contiene un nombre y un apellido.

public class MapPersonExample {
	public static void main(String[] args) {
		JavaSparkContext sc = new JavaSparkContext(
				new SparkConf().setAppName("FilterNamesExample").setMaster("local[3]"));
		List names = Arrays.asList("Alex,Bautista", "Pedro,Lopez", "Arturo,Mendez", "Juan,Sánchez",
				"Pancho,Pantera", "Jon,Smith");
		JavaRDD peopleRdd = sc.parallelize(names);
		JavaRDD customPeople = peopleRdd.map(p -> new Person(p.split(",")[0], p.split(",")[1]));
		System.out.println(customPeople);
		sc.close();
	}
}

El código anterior leerá un RDD de tipo String en el que cada elemento contendrá un nombre y un apellido, después utilizará la función map para transformarlo de un RDD de String a un RDD de tipo Person.

Cada vez veremos ejemplos más complejos, síguenos en nuestras redes sociales para enterarte sobre nuevo contenido https://www.facebook.com/devs4j/ y https://twitter.com/devs4j.

Puedes encontrar el código completo en el siguiente link https://github.com/raidentrance/spark-tutorial.

Autor: Alejandro Agapito Bautista

Twitter: @raidentrance

Contacto:raidentrance@gmail.com

Anuncios

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión /  Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión /  Cambiar )

Conectando a %s