Tôi đã tự hỏi điều gì khác biệt khi sử dụng tia lửa mapPartitions
chức năng so với val lười biếng thoáng qua.
Vì mỗi phân vùng cơ bản chạy trên một nút khác nhau, một trường hợp đơn giản của val lười biếng thoáng qua sẽ được tạo trên mỗi đầu (giả sử nó trong một đối tượng).Bản đồ tia lửaPhân tích vs valient lười biếng thoáng qua
Ví dụ:
class NotSerializable(v: Int) {
def foo(a: Int) = ???
}
object OnePerPartition {
@transient lazy val obj: NotSerializable = new NotSerializable(10)
}
object Test extends App{
val conf = new SparkConf().setMaster("local[2]").setAppName("test")
val sc = new SparkContext(conf)
val rdd: RDD[Int] = sc.parallelize(1 to 100000)
rdd.map(OnePerPartition.obj.foo)
// ---------- VS ----------
rdd.mapPartitions(itr => {
val obj = new NotSerializable(10)
itr.map(obj.foo)
})
}
Người ta có thể hỏi tại sao bạn sẽ thậm chí còn muốn nó ...
Tôi muốn tạo ra một khái niệm chứa chung của chạy logic của tôi trên bất kỳ thực hiện bộ sưu tập chung (RDD
, List
, scalding pipe
, v.v.)
Tất cả đều có khái niệm "bản đồ", nhưng mapPartition
là duy nhất cho spark
.