Với Spark 2.x và Scala 2.11
Tôi nghĩ đến 3 cách khả thi để chuyển đổi giá trị của một cột cụ thể thành Danh sách.
Các đoạn mã chung cho tất cả các phương pháp
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")
Phương pháp 1
df.select("id").collect().map(_(0)).toList
Điều gì xảy ra bây giờ? Chúng tôi đang thu thập dữ liệu cho Trình điều khiển collect()
và chọn phần tử 0 từ mỗi bản ghi.
Đây không thể là một cách làm xuất sắc, Hãy cải thiện nó bằng cách tiếp cận.
Cách tiếp cận 2
df.select("id").rdd.map(r => r(0)).collect.toList
Làm thế nào là nó tốt hơn? Chúng tôi đã phân phối tải chuyển đổi bản đồ giữa các công nhân thay vì một Trình điều khiển đơn lẻ.
Tôi biết rdd.map(r => r(0))
không có vẻ thanh lịch bạn. Vì vậy, hãy giải quyết nó trong cách tiếp cận tiếp theo.
Phương pháp 3
df.select("id").map(r => r.getString(0)).collect.toList
Ở đây chúng tôi không chuyển đổi DataFrame thành RDD. Hãy xem map
nó sẽ không chấp nhận r => r(0)
(hoặc _(0)
) như cách tiếp cận trước đây do sự cố bộ mã hóa trong DataFrame. Vì vậy, hãy kết thúc sử dụng r => r.getString(0)
và nó sẽ được giải quyết trong các phiên bản tiếp theo của Spark.
Phần kết luận
Tất cả các tùy chọn đều cho kết quả như nhau nhưng 2 và 3 là hiệu quả, cuối cùng thì lựa chọn thứ 3 là hiệu quả và thanh lịch (tôi nghĩ vậy).
Sổ ghi chép Databricks