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

标签 python lambda apache-spark pyspark pickle

据我所知,在使用 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/

相关文章:

python - 解码 Ascii 二进制

c# - 赋值不会使用 lambda 表达式修改 List ForEach 函数中的变量

c++ - Lambda 用法会导致转换错误

apache-spark - 如何在 dockerized Apache Zeppelin 后面公开 Spark 驱动程序?

python - 将特定文件从 Amazon S3 导入到 Google Cloud Storage

python - 在 Windows 上执行 pip installpsychopy 时出现错误消息

c++ - 使用 Lambda 进行模板类型推导

apache-spark - 何时使用 SPARK_CLASSPATH 或 SparkContext.addJar

python - 将特定功能应用于 Spark 数据框中的结构化列的有效方法?

python - 用 NA 替换 pandas 数据框中所有出现的值的快速方法