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 mvv
valeur. 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 count
s'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 count
en _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.