Dengan Spark 2.x dan Scala 2.11
Saya akan memikirkan 3 cara yang mungkin untuk mengonversi nilai kolom tertentu ke Daftar.
Potongan kode umum untuk semua pendekatan
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")
Pendekatan 1
df.select("id").collect().map(_(0)).toList
Apa yang terjadi sekarang? Kami mengumpulkan data ke Pengemudi dengan collect()
dan memilih elemen nol dari setiap catatan.
Ini bukanlah cara terbaik untuk melakukannya, Mari kita tingkatkan dengan pendekatan selanjutnya.
Pendekatan 2
df.select("id").rdd.map(r => r(0)).collect.toList
Bagaimana lebih baik? Kami telah mendistribusikan beban transformasi peta di antara para pekerja daripada Pengemudi tunggal.
Aku tahu rdd.map(r => r(0))
sepertinya kamu tidak elegan. Jadi, mari kita bahas itu dalam pendekatan selanjutnya.
Pendekatan 3
df.select("id").map(r => r.getString(0)).collect.toList
Di sini kami tidak mengonversi DataFrame ke RDD. Lihat map
itu tidak akan menerima r => r(0)
(atau _(0)
) sebagai pendekatan sebelumnya karena masalah encoder di DataFrame. Jadi akhirnya gunakan r => r.getString(0)
dan itu akan ditangani di versi Spark berikutnya.
Kesimpulan
Semua opsi memberikan output yang sama tetapi 2 dan 3 efektif, akhirnya yang ketiga efektif dan elegan (menurut saya).
Notebook Databricks