Zastanawiam się, co różni się za pomocą iskier mapPartitions
funkcjonalność vs przejściowy leniwy val.
Ponieważ każda partycja działa w zasadzie na innym węźle, każda instancja przejściowego leniwego val zostanie utworzona dla każdego węzła (zakładając, że jest w obiekcie).Spark mapPartitions vs transient lazy val
Na przykład:
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)
})
}
Można by zapytać, dlaczego byś nawet chcą go ...
Chciałbym stworzyć ogólne pojęcie pojemnik na moją logikę działa na dowolnym rodzajowy realizacji zbiórki (RDD
, List
, scalding pipe
, itp.)
Wszystkie z nich mają pojęcie "mapy", ale mapPartition
jest unikalny dla spark
.