Académique Documents
Professionnel Documents
Culture Documents
01 Núcleo de Conceptos
Resilient Distributed Dataset
• ¿Cómo crearlo?
• Colección de objetos existente
Python
lineas = sc.parellelize([“pandas”, “ositos”])
SCALA
lineas = sc.parellelize(List(“pandas”, “ositos”))
Resilient Distributed Dataset
• Archivo externo
Python
lineas = sc.parellelize(“/path/to/README.md”)
SCALA
lineas = sc.parellelize(“/path/to/README.md”)
Operaciones con RDD
• Transformaciones
• Dan como resultado un nuevo RDD.
• Son ejecutados de forma lazy, es decir, son ejecutadas sólo cuando son
utilizadas en una acción.
• Muchas transformaciones son element wise, esto es, trabajan sobre un
elemento a la vez.
Operaciones con RDD
• Transformaciones
Ejemplos:
Python
inputRDD = sc.textFile(“log.txt”)
errorsRDD = inputRDD.filter(lambda x: “error” in x)
warningsRDD = inputRDD.filter(lambda x: “error” in x)
badlinesRDD = errorRDD.union(warningsRDD)
SCALA
inputRDD = sc.textFile(“log.txt”)
errorsRDD = inputRDD.filter(line => line.contains(“error”))
Operaciones con RDD
• Acciones
• Son operaciones que dan como resultado un valor final hacia el programa
controlador o generan la instrucción de escritura al sistema externo de
almacenamiento.
• Las acciones forzan la evaluación de las transformaciones requeridas por el
RDD.
Operaciones con RDD
• Acciones
Ejemplo:
Python
print "Input had " + badLinesRDD.count() + " concerning lines"
print "Here are 10 examples:"
for line in badLinesRDD.take(10):
print line
SCALA
println("Input had " + badLinesRDD.count() + " concerning lines")
println("Here are 10 examples:")
badLinesRDD.take(10).foreach(println)
Operaciones con RDD
• Evaluación Lazy
• SPARK no ejecuta las transformaciones hasta que aparece una acción.
• Al llamar una transformación sobre un RDD la operación no es ejecutada de
forma inmediata. Spark sólo registra los metadatos para indicar la operación
solicitada.
• La ventaja de utilizar la evaluación lazy es agrupar operaciones.
• En SPARK no hay beneficio alguno de crear un mapeo complejo en lugar de
encadenar muchas operaciones simples.
Operaciones con RDD
def containsError(s):
return "error" in s
word = rdd.filter(containsError)
Operaciones con RDD
InputRDD
{1,2,3,4}
RDD1
{“hola México”, ”hola DF”,
”hola comunidad global”}
Mapped RDD
rdd1.flatMap(tokenize) {[“hola” , ” México” , ”hola” , “DF” , ”hola”
, “comunidad”, “global”] }
Transformaciones
RDD1 .subtract(RDD2)
{maratón, tenis}
Transformaciones
RDD1
{uno, dos, tres}
RDD1 .cartesian(RDD2)
{(uno,beisból), (uno, futból), (uno, basquetból),
RDD1.cartesian(RDD2)
(uno,beisból), (dos, futból), (dos, basquetból),
(tres,beisból), (tres, futból), (tres, basquetból)}
RDD2
{beisból, futból, basquetból}
Acciones
• El tipo de acción más común es reduce.
Ejemplo
reduce() in Python
sum = rdd.reduce(lambda x, y: x + y)
reduce() in Scala
val sum = rdd.reduce((x, y) => x + y)
• fold realiza la misma acción que reduce pero permite incorporar un valor inicial igual a 0, lo
cual es muy útil para listas vacías.
• Tanto fold como reduce requieren que el resultado sea del mismo tipo que los elementos del
RDD sobre los que se ejecuta la acción.
Acciones
• La función aggregate nos libera de la restricción de que el resultado sea del mismo tipo que el RDD
sobre el que estamos trabajando.
• aggregate() en Python
sumCount = nums.aggregate((0, 0),
(lambda acc, value: (acc[0] + value, acc[1] + 1),
(lambda acc1, acc2: (acc1[0] + acc2[0], acc1[1] + acc2[1]))))
return sumCount[0] / float(sumCount[1])
• aggregate() en Scala
val result = input.aggregate((0, 0))(
(acc, value) => (acc._1 + value, acc._2 + 1),
(acc1, acc2) => (acc1._1 + acc2._1, acc1._2 + acc2._2))
val avg = result._1 / result._2.toDouble
Acciones