Zobacz, dlaczego ten sposób, który robisz, nie działa. Po pierwsze, próbujesz uzyskać liczbę całkowitą z typu wiersza , wynik twojej kolekcji jest taki:
>>> mvv_list = mvv_count_df.select('mvv').collect()
>>> mvv_list[0]
Out: Row(mvv=1)
Jeśli weźmiesz coś takiego:
>>> firstvalue = mvv_list[0].mvv
Out: 1
Otrzymasz mvv
wartość. Jeśli chcesz uzyskać wszystkie informacje o tablicy, możesz wziąć coś takiego:
>>> mvv_array = [int(row.mvv) for row in mvv_list.collect()]
>>> mvv_array
Out: [1,2,3,4]
Ale jeśli spróbujesz tego samego dla drugiej kolumny, otrzymasz:
>>> 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'
Dzieje się tak, ponieważ count
jest to metoda wbudowana. Kolumna ma taką samą nazwę jak count
. Aby to zrobić, zmień nazwę kolumny count
na _count
:
>>> mvv_list = mvv_list.selectExpr("mvv as mvv", "count as _count")
>>> mvv_count = [int(row._count) for row in mvv_list.collect()]
Ale to obejście nie jest potrzebne, ponieważ możesz uzyskać dostęp do kolumny za pomocą składni słownika:
>>> mvv_array = [int(row['mvv']) for row in mvv_list.collect()]
>>> mvv_count = [int(row['count']) for row in mvv_list.collect()]
I w końcu zadziała!
list(df.select('mvv').toPandas()['mvv'])
. Arrow został zintegrowany z PySpark, cotoPandas
znacznie przyspieszyło . Nie używaj innych podejść, jeśli używasz platformy Spark 2.3+. Zobacz moją odpowiedź, aby uzyskać więcej szczegółów dotyczących testów porównawczych.