ดูสิทำไมวิธีที่คุณทำอยู่นี้ไม่ได้ผล ขั้นแรกคุณพยายามหาจำนวนเต็มจากRow Type ผลลัพธ์ของการรวบรวมของคุณจะเป็นดังนี้:
>>> 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'])
OutOfMemory: Arrow ถูกรวมเข้ากับ PySparkซึ่งเพิ่มความเร็วขึ้นtoPandas
อย่างมาก อย่าใช้แนวทางอื่นหากคุณใช้ Spark 2.3+ ดูคำตอบของฉันสำหรับรายละเอียดการเปรียบเทียบเพิ่มเติม