Vedi, perché in questo modo che stai facendo non funziona. Innanzitutto, stai cercando di ottenere un numero intero da un tipo di riga , l'output della tua raccolta è come questo:
>>> mvv_list = mvv_count_df.select('mvv').collect()
>>> mvv_list[0]
Out: Row(mvv=1)
Se prendi qualcosa del genere:
>>> firstvalue = mvv_list[0].mvv
Out: 1
Otterrai il mvv
valore. Se vuoi tutte le informazioni dell'array puoi prendere qualcosa del genere:
>>> mvv_array = [int(row.mvv) for row in mvv_list.collect()]
>>> mvv_array
Out: [1,2,3,4]
Ma se provi lo stesso per l'altra colonna, ottieni:
>>> 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'
Questo accade perché count
è un metodo integrato. E la colonna ha lo stesso nome di count
. Una soluzione alternativa per farlo è modificare il nome della colonna count
in _count
:
>>> mvv_list = mvv_list.selectExpr("mvv as mvv", "count as _count")
>>> mvv_count = [int(row._count) for row in mvv_list.collect()]
Ma questa soluzione alternativa non è necessaria, poiché puoi accedere alla colonna utilizzando la sintassi del dizionario:
>>> mvv_array = [int(row['mvv']) for row in mvv_list.collect()]
>>> mvv_count = [int(row['count']) for row in mvv_list.collect()]
E finalmente funzionerà!
list(df.select('mvv').toPandas()['mvv'])
. Arrow è stato integrato in PySpark che ha acceleratotoPandas
notevolmente. Non utilizzare gli altri approcci se utilizzi Spark 2.3+. Vedi la mia risposta per ulteriori dettagli sul benchmarking.