คำตอบของจัสตินนั้นยอดเยี่ยมและการตอบสนองนี้จะลึกซึ้งยิ่งขึ้น
repartition
อัลกอริทึมไม่สับเต็มรูปแบบและสร้างพาร์ทิชันใหม่ที่มีข้อมูลที่กระจายอย่างสม่ำเสมอ มาสร้าง DataFrame ด้วยตัวเลขตั้งแต่ 1 ถึง 12
val x = (1 to 12).toList
val numbersDf = x.toDF("number")
numbersDf
มี 4 พาร์ติชันบนเครื่องของฉัน
numbersDf.rdd.partitions.size // => 4
นี่คือวิธีแบ่งข้อมูลในพาร์ติชัน:
Partition 00000: 1, 2, 3
Partition 00001: 4, 5, 6
Partition 00002: 7, 8, 9
Partition 00003: 10, 11, 12
ลองทำแบบสุ่มด้วยrepartition
วิธีการและรับข้อมูลนี้บนสองโหนด
val numbersDfR = numbersDf.repartition(2)
นี่คือวิธีการnumbersDfR
แบ่งพาร์ติชันข้อมูลบนเครื่องของฉัน:
Partition A: 1, 3, 4, 6, 7, 9, 10, 12
Partition B: 2, 5, 8, 11
repartition
วิธีทำให้พาร์ทิชันใหม่และทั่วถึงกระจายข้อมูลในพาร์ทิชันใหม่ (การกระจายข้อมูลที่มีมากยิ่งขึ้นสำหรับชุดข้อมูลขนาดใหญ่)
ความแตกต่างระหว่างcoalesce
และrepartition
coalesce
ใช้พาร์ติชันที่มีอยู่เพื่อลดจำนวนข้อมูลที่ลดลง repartition
สร้างพาร์ติชันใหม่และสลับแบบเต็ม coalesce
ผลลัพธ์ในพาร์ติชันที่มีจำนวนข้อมูลที่แตกต่างกัน (บางครั้งพาร์ติชันที่มีขนาดแตกต่างกันมาก) และrepartition
ผลลัพธ์ในพาร์ติชันที่มีขนาดเท่ากันโดยประมาณ
เป็นcoalesce
หรือrepartition
เร็วกว่า?
coalesce
อาจทำงานเร็วกว่าrepartition
แต่พาร์ติชันที่มีขนาดไม่เท่ากันโดยทั่วไปจะทำงานช้ากว่าพาร์ติชันที่มีขนาดเท่ากัน โดยปกติคุณจะต้องแบ่งพาร์ติชันชุดข้อมูลใหม่หลังจากกรองชุดข้อมูลขนาดใหญ่ ฉันพบว่าrepartition
โดยรวมเร็วขึ้นเพราะ Spark ถูกสร้างขึ้นเพื่อทำงานกับพาร์ติชันที่มีขนาดเท่ากัน
NB ฉันสังเกตเห็นอย่างสงสัยว่าการแบ่งพาร์ติชันสามารถเพิ่มขนาดของข้อมูลบนดิสก์ได้ ตรวจสอบให้แน่ใจว่าได้ทำการทดสอบเมื่อคุณใช้การแบ่งพาร์ติชัน / เชื่อมต่อกันบนชุดข้อมูลขนาดใหญ่
อ่านโพสต์บล็อกนี้หากคุณต้องการรายละเอียดเพิ่มเติม
เมื่อใดที่คุณจะใช้การรวมตัวกันและการแบ่งส่วนในทางปฏิบัติ
minimize data movement
avoiding data movement