Подивіться, чому цей спосіб, який ви робите, не працює. По-перше, ви намагаєтесь отримати ціле число з типу рядка , результат вашого збору такий:
>>> mvv_list = mvv_count_df.select('mvv').collect()
>>> mvv_list[0]
Out: Row(mvv=1)
Якщо взяти щось подібне:
>>> firstvalue = mvv_list[0].mvv
Out: 1
Ви отримаєте mvv
значення. Якщо ви хочете отримати всю інформацію про масив, ви можете взяти щось подібне:
>>> mvv_array = [int(row.mvv) for row in mvv_list.collect()]
>>> mvv_array
Out: [1,2,3,4]
Але якщо ви спробуєте те ж саме для іншого стовпця, ви отримаєте:
>>> 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'
Це відбувається тому count
, що це вбудований метод. І стовпець має те саме ім’я, що і count
. Рішення для цього - це змінити назву стовпця count
на _count
:
>>> mvv_list = mvv_list.selectExpr("mvv as mvv", "count as _count")
>>> mvv_count = [int(row._count) for row in mvv_list.collect()]
Але це обхідне рішення не потрібне, оскільки ви можете отримати доступ до стовпця за допомогою синтаксису словника:
>>> mvv_array = [int(row['mvv']) for row in mvv_list.collect()]
>>> mvv_count = [int(row['count']) for row in mvv_list.collect()]
І це нарешті запрацює!
list(df.select('mvv').toPandas()['mvv'])
. Стрілка була інтегрована в PySpark, щоtoPandas
значно пришвидшилось . Не використовуйте інші підходи, якщо ви використовуєте Spark 2.3+. Дивіться мою відповідь, щоб отримати докладнішу інформацію.