Python - transformar dataframe en rdd sin que salga Row

 
Vista:

transformar dataframe en rdd sin que salga Row

Publicado por pelirr (2 intervenciones) el 11/07/2018 16:09:59
Hola,

Estoy intentando obtener un rdd a partir de un dataframe. Después, quiero obtener un histograma de frecuencias con ese rdd. Pero al intentar el paso de dataframe a rdd, el rdd que obtengo no lo puedo tratar como necesito. Los pasos que sigo son:
1
rdd = dataframe.rdd
de manera que obtengo lo siguiente:
1
[Row(desayuno='1 taza de kefir de vaca; 5 g inulina; 2 craquers arroz integral; homos; 2 ajos; 1 tomate; 2 lonchas jamón serrano; 3 nueces; 1 kiwi; infusión de jengibre y manzanilla y anis estrellado y canela', almuerzo='1 plátano', comida='carne de morcillo cocida y asada; patata asada; crema de nueces y aceite y maicena y comino; queso oveja; cherries; postre lácteo de nata y chocolate', merienda=None, cena='patatas fritas; 1 huevo frito; 1 pepino; 1 ajo'), Row(desayuno='1 taza de kefir casero de cabra; 1 endivia; 1 lata de atún en aceite; medio tomate; 2 ajos; 1 puñado de pasas; 3 nueces; media naranja; infusión de tomillo y salvia y manzanilla', almuerzo='1 pepino; 1 pera; 40 g almendras y anacardos; te verde con manzanilla', comida='espinacas rehogadas con ajo; magro de cerdo', merienda=None, cena='suero sabor fresa')]

No sé porqué sale la parte dónde pone 'Row'.
Lo que quiero es juntarlo todo y crear un rdd a partir de ello, sumando los valores correspondientes a desayuno, almuerzo, comida, merienda y cena de todas las líneas.
He intentado obtenerlo como un string, de la siguiente manera:
1
2
3
4
5
6
string = ''
for i in range (0, rdd.count()):
if (i==rdd.count()-1):
    string = string +rdd.take(i+1)[i].desayuno+"; " + rdd.take(i+1)[i].almuerzo+"; " +rdd.take(i+1)[i].comida+"; " + rdd.take(i+1)[i].merienda+";  " + rdd.take(i+1)[i].cena
else:
    string = string +rdd.take(i+1)[i].desayuno+"; " + rdd.take(i+1)[i].almuerzo+"; " +rdd.take(i+1)[i].comida+"; " + rdd.take(i+1)[i].merienda+";  " + rdd.take(i+1)[i].cena+"; "

Creo un nuevo rdd con el string resultante, y obtengo lo siguiente:
1
2
3
nuevordd= sc.parallelize([string])
nuevordd.collect()
['1 taza de kefir de vaca; 5 g inulina; 2 craquers arroz integral; homos; 2 ajos; 1 tomate; 2 lonchas jamón serrano; 3 nueces; 1 kiwi; infusión de jengibre y manzanilla y anis estrellado y canela; 1 plátano; carne de morcillo cocida y asada; patata asada; crema de nueces y aceite y maicena y comino; queso oveja; cherries; postre lácteo de nata y chocolate; Nada;  patatas fritas; 1 huevo frito; 1 pepino; 1 ajo; 1 taza de kefir casero de cabra; 1 endivia; 1 lata de atún en aceite; medio tomate; 2 ajos; 1 puñado de pasas; 3 nueces; media naranja; infusión de tomillo y salvia y manzanilla; 1 pepino; 1 pera; 40 g almendras y anacardos; te verde con manzanilla; espinacas rehogadas con ajo; magro de cerdo; Nada;  suero sabor fresa; ']

Después, según literatura que he leído, lo siguiente debería funcionar.
1
2
3
4
import re
palabras = nuevordd.filter(lambda palabra: palabra  != ‘’).map(lambda palabra: palabra.lower()))
histograma = (palabras.map(lambda palabra : (palabra,1)).reduceByKey(lambda x,y: x+y))
masFrecuentes = histograma.sortBy(lambda (k,v): -v).take(15)

Pero no funciona. Tengo varias dudas:
¿Porqué me sale al principio el 'Row' al pasar de dataframe a rdd?¿Como podría hacer que no saliera?
¿Porqué no funciona la obtención de las frecuencias? Es cierto que no quiero obtener la frecuencia de una palabra, sino de un grupo de palabras, ¿podría ser ese el problema para que no obtenga lo que busco?

Cualquier orientación sería de gran ayuda.
Por cierto, estoy trabajando con python y pyspark, sin ningún entorno ni similar.

Muchas gracias
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder