ด้วย Spark 2.x และ Scala 2.11
ฉันคิดถึง 3 วิธีที่เป็นไปได้ในการแปลงค่าของคอลัมน์เฉพาะเป็นรายการ
ข้อมูลโค้ดทั่วไปสำหรับทุกแนวทาง
import org.apache.spark.sql.SparkSession
val spark = SparkSession.builder.getOrCreate
import spark.implicits._
val df = Seq(
("first", 2.0),
("test", 1.5),
("choose", 8.0)
).toDF("id", "val")
แนวทาง 1
df.select("id").collect().map(_(0)).toList
เกิดอะไรขึ้น? เรากำลังรวบรวมข้อมูลไปยัง Driver ด้วยcollect()
และเลือกองค์ประกอบที่เป็นศูนย์จากแต่ละระเบียน
นี่อาจไม่ใช่วิธีที่ยอดเยี่ยมในการทำเช่นนี้เรามาปรับปรุงด้วยแนวทางต่อไป
แนวทาง 2
df.select("id").rdd.map(r => r(0)).collect.toList
มันดีกว่ายังไง? เราได้กระจายภาระการแปลงแผนที่ในหมู่คนงานมากกว่าไดรเวอร์เดี่ยว
ฉันรู้rdd.map(r => r(0))
ว่าคุณดูไม่สง่างาม ดังนั้นเรามาแก้ไขกันในแนวทางถัดไป
แนวทาง 3
df.select("id").map(r => r.getString(0)).collect.toList
ที่นี่เราไม่ได้แปลง DataFrame เป็น RDD ดูmap
ว่าจะไม่ยอมรับr => r(0)
(หรือ_(0)
) เป็นวิธีการก่อนหน้าเนื่องจากปัญหาตัวเข้ารหัสใน DataFrame จบลงด้วยการใช้r => r.getString(0)
และจะกล่าวถึงใน Spark เวอร์ชันถัดไป
สรุป
ตัวเลือกทั้งหมดให้ผลลัพธ์เดียวกัน แต่ 2 และ 3 มีประสิทธิภาพในที่สุดตัวที่ 3 ก็มีประสิทธิภาพและสวยงาม (ฉันคิดว่า)
สมุดบันทึก Databricks