Convertir la columna de DataFrame de la chispa a la lista de python

Trabajo en un dataframe con dos columnas, mvv y count.

+---+-----+ |mvv|count| +---+-----+ | 1 | 5 | | 2 | 9 | | 3 | 3 | | 4 | 1 | 

Me gustaría obtener dos listas que contengan valores mvv y valor de conteo. Algo como

 mvv = [1,2,3,4] count = [5,9,3,1] 

Entonces, probé el siguiente código: La primera línea debería devolver una lista de fila de python. Quería ver el primer valor:

 mvv_list = mvv_count_df.select('mvv').collect() firstvalue = mvv_list[0].getInt(0) 

Pero me sale un mensaje de error con la segunda línea:

AttributeError: getInt

Mira, por qué esta forma en la que estás haciendo no funciona. Primero, está intentando obtener un entero de un tipo de fila , la salida de su recostackción es así:

 >>> mvv_list = mvv_count_df.select('mvv').collect() >>> mvv_list[0] Out: Row(mvv=1) 

Si tomas algo como esto:

 >>> firstvalue = mvv_list[0].mvv Out: 1 

Obtendrá el valor mvv . Si quieres toda la información de la matriz puedes tomar algo como esto:

 >>> mvv_array = [int(row.mvv) for row in mvv_list.collect()] >>> mvv_array Out: [1,2,3,4] 

Pero si intentas lo mismo para la otra columna, obtienes:

 >>> mvv_count = [int(row.count) for row in mvv_list.collect()] Out: TypeError: int() argument must be a string or a number, not 'builtin_function_or_method' 

Esto sucede porque el count es un método incorporado. Y la columna tiene el mismo nombre que count . Una solución para hacer esto es cambiar el nombre de la columna de count a _count :

 >>> mvv_list = mvv_list.selectExpr("mvv as mvv", "count as _count") >>> mvv_count = [int(row._count) for row in mvv_list.collect()] 

Pero esta solución no es necesaria, ya que puede acceder a la columna utilizando la syntax del diccionario:

 >>> mvv_array = [int(row['mvv']) for row in mvv_list.collect()] >>> mvv_count = [int(row['count']) for row in mvv_list.collect()] 

¡Y finalmente funcionará!

Siguiendo un trazador de líneas da la lista que desea.

 mvv = mvv_count_df.select("mvv").rdd.flatMap(lambda x: x).collect() 

Esto te dará todos los elementos en forma de lista.

 mvv_list = list( mvv_count_df.select('mvv').toPandas()['mvv'] ) 

El siguiente código te ayudará

 mvv_count_df.select('mvv').rdd.map(lambda row : row[0]).collect() 

Si obtiene el error a continuación:

AttributeError: el objeto ‘list’ no tiene ningún atributo ‘collect’

Este código solucionará tus problemas:

 mvv_list = mvv_count_df.select('mvv').collect() mvv_array = [int(i.mvv) for i in mvv_list] 

En mis datos tengo estos puntos de referencia:

 >>> data.select(col).rdd.flatMap(lambda x: x).collect() 

0.52 seg

 >>> [row[col] for row in data.collect()] 

0.271 seg

 >>> list(data.select(col).toPandas()[col]) 

0.427 seg

El resultado es el mismo