Foro Formación Hadoop
Dudas con ejercicios Módulo 3
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
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,
Redes sociales