Voyez, pourquoi cette façon que vous faites ne fonctionne pas. Tout d'abord, vous essayez d'obtenir un entier à partir d'un type de ligne , la sortie de votre collecte est comme ceci:
>>> mvv_list = mvv_count_df.select('mvv').collect()
>>> mvv_list[0]
Out: Row(mvv=1)
Si vous prenez quelque chose comme ça:
>>> firstvalue = mvv_list[0].mvv
Out: 1
Vous obtiendrez la mvvvaleur. Si vous voulez toutes les informations du tableau, vous pouvez prendre quelque chose comme ceci:
>>> mvv_array = [int(row.mvv) for row in mvv_list.collect()]
>>> mvv_array
Out: [1,2,3,4]
Mais si vous essayez la même chose pour l'autre colonne, vous obtenez:
>>> 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'
Cela se produit car il counts'agit d'une méthode intégrée. Et la colonne porte le même nom que count. Une solution de contournement pour ce faire est de modifier le nom de la colonne de counten _count:
>>> mvv_list = mvv_list.selectExpr("mvv as mvv", "count as _count")
>>> mvv_count = [int(row._count) for row in mvv_list.collect()]
Mais cette solution de contournement n'est pas nécessaire, car vous pouvez accéder à la colonne à l'aide de la syntaxe du dictionnaire:
>>> mvv_array = [int(row['mvv']) for row in mvv_list.collect()]
>>> mvv_count = [int(row['count']) for row in mvv_list.collect()]
Et cela fonctionnera enfin!
list(df.select('mvv').toPandas()['mvv']). Arrow a été intégré à PySpark, ce qui a considérablement accélérétoPandas. N'utilisez pas les autres approches si vous utilisez Spark 2.3+. Voir ma réponse pour plus de détails sur l'analyse comparative.