据我所知,在使用 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 序列化整个对象。
关于python - PySpark 在映射 lambda 中序列化 'self' 引用对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36508685/