Hãy xem, tại sao cách bạn đang làm này không hoạt động. Trước tiên, bạn đang cố gắng lấy số nguyên từ Loại hàng , đầu ra của bộ sưu tập của bạn như sau:
>>> mvv_list = mvv_count_df.select('mvv').collect()
>>> mvv_list[0]
Out: Row(mvv=1)
Nếu bạn lấy một cái gì đó như thế này:
>>> firstvalue = mvv_list[0].mvv
Out: 1
Bạn sẽ nhận được mvvgiá trị. Nếu bạn muốn tất cả thông tin của mảng, bạn có thể lấy một cái gì đó như sau:
>>> mvv_array = [int(row.mvv) for row in mvv_list.collect()]
>>> mvv_array
Out: [1,2,3,4]
Nhưng nếu bạn thử tương tự cho cột kia, bạn sẽ nhận được:
>>> 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'
Điều này xảy ra bởi vì countlà một phương thức được tích hợp sẵn. Và cột có tên giống như count. Một giải pháp để thực hiện việc này là thay đổi tên cột countthành _count:
>>> mvv_list = mvv_list.selectExpr("mvv as mvv", "count as _count")
>>> mvv_count = [int(row._count) for row in mvv_list.collect()]
Nhưng cách giải quyết này không cần thiết, vì bạn có thể truy cập cột bằng cú pháp từ điển:
>>> mvv_array = [int(row['mvv']) for row in mvv_list.collect()]
>>> mvv_count = [int(row['count']) for row in mvv_list.collect()]
Và cuối cùng nó sẽ hoạt động!
list(df.select('mvv').toPandas()['mvv']). Arrow được tích hợp vào PySpark đã tăng tốctoPandasđáng kể. Không sử dụng các cách tiếp cận khác nếu bạn đang sử dụng Spark 2.3+. Xem câu trả lời của tôi để biết thêm chi tiết về điểm chuẩn.