PySpark在地图lambdas中序列化'self'引用的对象?

时间:2016-04-08 20:23:31

标签: python lambda apache-spark pyspark pickle

据我了解,在使用Spark Scala界面时,我们必须注意,当只需要一个或两个属性时,不要不必要地序列化完整对象:(http://erikerlandson.github.io/blog/2015/03/31/hygienic-closures-for-scala-function-serialization/

使用PySpark时这是如何工作的?如果我有一个课程如下:

class C0(object):

  def func0(arg):
    ...

  def func1(rdd):
    result = rdd.map(lambda x: self.func0(x))

这会导致腌制完整的C0实例吗?如果是的话,避免它的正确方法是什么?

感谢。

1 个答案:

答案 0 :(得分:3)

根据此文档,这会导致整个C0实例的挑选:http://spark.apache.org/docs/latest/programming-guide.html#passing-functions-to-spark

为了避免它,请执行以下操作:

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))

故事的道德:避免在地图调用中的任何位置使用self关键字。 Spark可以很聪明地序列化单个函数,如果它可以在局部闭包中计算函数,但任何对self的引用都会激发序列化整个对象。