Según tengo entendido, al utilizar la interfaz de Spark Scala debemos tener cuidado de no serializar innecesariamente un objeto completo cuando solo se necesitan uno o dos atributos: ( http://erikerlandson.github.io/blog/2015/03/ 31 / higienic-closures-for-scala-function-serialization / )
¿Cómo funciona esto cuando se utiliza PySpark? Si tengo una clase de la siguiente manera:
class C0(object): def func0(arg): ... def func1(rdd): result = rdd.map(lambda x: self.func0(x))
¿Esto da como resultado decapado de las instancias completas de C0? Si es así, ¿cuál es la forma correcta de evitarlo?
Gracias.
De acuerdo con esta documentación: http://spark.apache.org/docs/latest/programming-guide.html#passing-functions-to-spark .
Para evitarlo, haz algo como:
class C0(object): def func0(self, arg): # added self ... def func1(self, rdd): # added self func = self.func0 result = rdd.map(lambda x: func(x))
La moraleja de la historia: evitar la palabra clave self
en cualquier lugar en una llamada de mapa. La chispa puede ser inteligente en cuanto a serializar una sola función si puede calcular la función en un cierre local, pero cualquier referencia a la self
fuerza obliga a serializar todo su objeto.