Foro Formación Hadoop

 
 
Imagen de Alfonso Porras Fernández
Dudas con ejercicios Módulo 3
de Alfonso Porras Fernández - jueves, 13 de julio de 2017, 19:02
 

Hola,

sólo por curiosidad, al hacer los ejercicios del módulo 3 estoy encontrando algunas cosas que me resultan raras:

ejemplo, en el ejercicio de Trabajando con pares RDD

ejecuta la carga y al hago la instruccion

# map each request (line) to a pair (userid, 1)
userreqs = logs \
.map(lambda line: line.split()) \
.map(lambda words: (words[2],1)) \
.reduceByKey(lambda count1,count2: count1 + count2)

si hago un la siguiente instruccion

userreqs.map(lambda pair: (pair[1],pair[0])).sortByKey(False).take(10)

, me salen unos caracteres extraños:

[(667, u'193'), (636, u'13'), (620, u'24'), (610, u'147'), (606, u'84'), (606, u'110'), (604, u'111'), (603, u'77'), (600, u'126'), (600, u'21')]

¿esa 'u' antes del id_usuario, puede ser error de mi configuración?

también, al hacer la agrupación siguiente:

# Group IPs by user ID
userips = logs \
.map(lambda line: line.split()) \
.map(lambda words: (words[2],words[0])) \
.groupByKey()
userips.take(10)

obtengo datos extraños:

[(u'112693', <pyspark.resultiterable.ResultIterable object at 0x237dd10>), (u'15124', <pyspark.resultiterable.ResultIterable object at 0x237df50>), (u'115133', <pyspark.resultiterable.ResultIterable object at 0x2381050>), (u'64784', <pyspark.resultiterable.ResultIterable object at 0x2381190>), (u'98189', <pyspark.resultiterable.ResultIterable object at 0x2381650>), (u'65758', <pyspark.resultiterable.ResultIterable object at 0x2381690>), (u'119209', <pyspark.resultiterable.ResultIterable object at 0x23819d0>), (u'38529', <pyspark.resultiterable.ResultIterable object at 0x2381c90>), (u'23042', <pyspark.resultiterable.ResultIterable object at 0x2381e50>), (u'50361', <pyspark.resultiterable.ResultIterable object at 0x238c0d0>)]

¿Puede ser algo de memoria?

Gracias!!

Un saludo

 

 
Imagen de Fernando Agudo
Re: Dudas con ejercicios Módulo 3
de Fernando Agudo - viernes, 14 de julio de 2017, 08:32
 

Hola Alfonso,

A la primera pregunta, esa "u" extraña es debido a que es una tupla en Unicode (https://docs.python.org/2/howto/unicode.html), dentro de un array [....] que es lo que devuelve el take.

Si necesitaras acceder a las tuplas del array que te ha devuelto el take para mostrarlo por pantalla de manera "bonita", podrías hacer los siguiente:

 

result = userreqs.map(lambda pair: (pair[1],pair[0])).sortByKey(False).take(10)

for x in result: print str(x[0])+"...."+str(x[1])

El código anterior te asigna el resultado a una variable "result" y posteriormente recorremos esa variable con el for para ir mostrando los 2 elementos de cada una de las posiciones del array.

 

La segunda pregunta es igual que la anterior. El take te devuelve un array compuesto por registros/tuplas donde el segundo valor es un interador. Si quisieras ver las ips, deberías recorrer cada uno de los valores-iteradores con un buque for de la siguiente manera:

for (ids,ips) in userips.take(10):
   print "---" ,ids
   for ip in ips: print ip

 

Recuerda que todas estas operaciones ya se realizan en el driver (cliente), debido a que hemos "extraído" del procesamiento de Spark con el take y a partir de ese momento ya estaríamos trabajando con python "normal".

Un saludo,