Foro Formación Hadoop

 
 
Imagen de Jesús Marcial Méndez Gálvez
Consulta de Codigo Spark
de Jesús Marcial Méndez Gálvez - miércoles, 13 de julio de 2016, 05:12
 

buen día, tengo una consulta referente al modulo 3 Spark. 

Sobre las diferencias entre la funcion MAP y FLATMAP. un ejemplo por favor .

 
Imagen de Fernando Agudo
Re: Consulta de Codigo Spark
de Fernando Agudo - miércoles, 13 de julio de 2016, 11:14
 

Hola Jesús,

Con la función map lo que obtienes es la relación 1 - 1, es decir, por cada registro de tú RDD obtienes un registro en el nuevo RDD.

Con la función flatmap lo que obtienes es una relación 1 - n, es decir, por cada registro de tú RDD obtienes n registros en el nuevo RDD.

 

Ejemplo en el WordCount en python:

Dado mi RDD datos (RDD con el contenido de los ficheros de los cuales quiero obtener el número de veces que se aparece cada palabra):

//Cargo los datos en mi rdd datos
datos
= sc.textFile("hdfs://...")

//Ahora mismo mi RDD datos tiene n registros (uno por cada línea de los ficheros que he cargado), lo que quiero obtener es un nuevo rdd que separe cada una de las palabras de las líneas convirtiéndolas cada una en un registro de mi nuevo rdd (relación 1 - n , 1 línea - n palabras), por lo que debo utilizar la función flatmap. El resultado de la operación "split" me va a devoler esos n registros nuevos por cada registro del antiguo rdd:
palabras = datos.flatMap(lambda line: line.split(" "))

La instrucción anterior crea un rdd en el que cada registro es una palabra. A continuación lo que debemos obtener es un nuevo rdd en el que cada registro del actual lo convierta en un pair RDD con la palabra y el valor 1 para posteriormente poder realizar la suma de las veces que aparece esa palabra, esto es una relación 1 - 1, una palabra, creo palabra y el valor 1, por lo que debo utilizar la función map:

pair_rdd = palabras.map(lambda word: (word, 1))
Y por último realizo la suma: resultado = pair_rdd.reduceByKey(lambda a, b: a + b)

 

Espero que más o menos te haya quedado claro. Resumiendo sería lo que te comento:

Función Map cuando quieres seguir teniendo el mismo número de registros por cada registro de tú RDD actual (1 - 1)

Función FlatMap cuando quieres obtener n registros a partir de cada uno de los registros de tú RDD actual ( 1 - n)

 

Un saludo,

 

Imagen de Jesús Marcial Méndez Gálvez
Re: Consulta de Codigo Spark
de Jesús Marcial Méndez Gálvez - miércoles, 13 de julio de 2016, 21:15
 

Gracias por la respuesta Fernando, ahora lo tengo más claro..

Quisiera agregar una duda... actualmente estoy practicando los ejercicios de join en este modulo. 

una vez cargadas mis 2 DataSets, ejemplo a  y b.

A  = Array (String, int)

B = array (Char, Int)   

En este caso al tratar d hacer un join por la key (valor 1)  me genera error de tipo de datos..  Como soluciono esto?    los tipos de datos al realizar el map al dataset  automaticamente se generaron asi.   Gracias d antemano

Imagen de Admin Formación Hadoop
Re: Consulta de Codigo Spark
de Admin Formación Hadoop - miércoles, 13 de julio de 2016, 22:50
 

Jesús, el problema lo debes tener en las instrucciones anteriores (map). ¿Me podrías indicar las sentencias que estás utilizando para generar los 2 RDD con las funciones map?

Ten en cuenta que tienes que generar 2 Pair de RDDs para utilizar la key para realizar el join.

Un saludo

Imagen de Jesús Marcial Méndez Gálvez
Re: Consulta de Codigo Spark
de Jesús Marcial Méndez Gálvez - jueves, 14 de julio de 2016, 06:02
 

Gracias por la respuesta, acabo de realizar nuevamente la operación y ya no me genera error, al parecer olvide un paso de map.  Tengo una duda. 

Respecto a este paso:

var logs2 = sc.textFile(files).map(x=>x.split(' ')).map(x=>(x(2),1)).reduceByKey((x,y)=> x+y)

-- me devuelve un array con este formato
 Array[(String, Int)] = Array((60181,4))  

Ya que automaticamente la key x(2) la reconoce como String apesar de ser númerica, como se haria si yo quisiera que lo reconozca como tipo INT.? Solo es una duda :).
Imagen de Fernando Agudo
Re: Consulta de Codigo Spark
de Fernando Agudo - viernes, 15 de julio de 2016, 12:00
 

Hola Jesús,

Spark automáticamente crea los RDD en base al tipo que los valores. En el caso que comentas te crea String, Int ya que en la función split que estás generando devuelve un String (te estás quedando con la 3 posición - x(2)) y el segundo valor es int por el valor entero 1 que estas añadiendo.

Si quisieras que te devolviera Int, Int , deberías convertir el resultado del split - x(2) en entero. Ejemplo:

var logs2 = sc.textFile(files).map(x=>x.split(' ')).map(x=>(x(2).toInt,1)).reduceByKey((x,y)=> x+y)

 

Esto te debería devolver un RDD logs2 de INT-INT.

Un saludo,

Imagen de Jesús Marcial Méndez Gálvez
Re: Consulta de Codigo Spark
de Jesús Marcial Méndez Gálvez - viernes, 15 de julio de 2016, 17:04
 

Excelente, ya se me estaba quedando la duda en como hacer un join con clave de tipo de dato diferente.. ahora veo como convertirlo. Un saludo,  gracias.