据我了解,在使用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实例吗?如果是的话,避免它的正确方法是什么?
感谢。
答案 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
的引用都会激发序列化整个对象。