Skip to main content
 首页 » 编程设计

python之PySpark 在映射 lambda 中序列化 'self' 引用对象

2024年08月23日36over140

据我所知,在使用 Spark Scala 接口(interface)时,我们必须小心,不要在只需要一个或两个属性时不必要地序列化一个完整的对象:( 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)) 

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

谢谢。

请您参考如下方法:

根据此文档,这确实会导致整个 C0 实例的 pickle :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)) 

故事的寓意:避免在 map 调用中的任何地方使用 self 关键字。如果 Spark 可以在本地闭包中计算函数,那么 Spark 可以很聪明地序列化单个函数,但是对 self 的任何引用都会强制 spark 序列化整个对象。