5
我想知道什麼是不同的使用火花mapPartitions
功能與瞬態懶惰val。
由於每個分區基本上都在不同的節點上運行,因此每個節點上都會創建一個臨時lazy val實例(假設它在一個對象中)。Spark mapPartitions vs transient lazy val
例如:
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)
})
}
也許有人會問,爲什麼你甚至想它...
我想創建一個普通的容器的概念對任何泛型集合實現(RDD
運行我的邏輯,List
,scalding pipe
等)
他們都有一個「地圖」的概念,但mapPartition
是唯一的spark
。