代码之家  ›  专栏  ›  技术社区  ›  x89a10

PySpark序列化映射lambdas中的“自”引用对象?

  •  3
  • x89a10  · 技术社区  · 10 年前

    据我所知,在使用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 回复  |  直到 10 年前
        1
  •  6
  •   Matt Messersmith    10 年前

    根据本文件,这确实会导致整个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可以在本地闭包中计算函数,那么它可以聪明地序列化单个函数 自己 强制spark序列化整个对象。