Mira, por qué esta forma en que lo estás haciendo no funciona. Primero, está tratando de obtener un número entero de un tipo de fila , el resultado de su recopilación es así:
>>> mvv_list = mvv_count_df.select('mvv').collect()
>>> mvv_list[0]
Out: Row(mvv=1)
Si toma algo como esto:
>>> firstvalue = mvv_list[0].mvv
Out: 1
Obtendrás el mvv
valor. Si desea toda la información de la matriz, puede 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 count
es un método incorporado. Y la columna tiene el mismo nombre que count
. Una solución alternativa 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 alternativa no es necesaria, ya que puede acceder a la columna utilizando la sintaxis 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á!
list(df.select('mvv').toPandas()['mvv'])
. Arrow se integró en PySpark, lo que acelerótoPandas
significativamente. No use los otros enfoques si está usando Spark 2.3+. Consulte mi respuesta para obtener más detalles sobre la evaluación comparativa.