Python 在自实现对象/类的函数上使用Pysparks rdd.parallelize().map()

Python 在自实现对象/类的函数上使用Pysparks rdd.parallelize().map(),python,class,apache-spark,pyspark,rdd,Python,Class,Apache Spark,Pyspark,Rdd,我有一些我想并行计算的对象,所以我想我可以求助于pyspark 考虑这个例子,一个类的对象有一个数字i,可以用square()进行平方: 类MyMathObject(): 定义初始化(self,i): self.i=i def方形(自): 返回自我。i**2 print(MyMathObject(3.square())#使用常规python-works测试一个实例 另外,我设置了pyspark(在jupyter笔记本中),现在我想在我的对象上并行计算0到4的平方: 导入findspark fi

我有一些我想并行计算的对象,所以我想我可以求助于pyspark

考虑这个例子,一个类的对象有一个数字
i
,可以用
square()
进行平方:

类MyMathObject():
定义初始化(self,i):
self.i=i
def方形(自):
返回自我。i**2
print(MyMathObject(3.square())#使用常规python-works测试一个实例
另外,我设置了pyspark(在jupyter笔记本中),现在我想在我的对象上并行计算0到4的平方:

导入findspark
findspark.init()
从pyspark导入SparkContext
sc=SparkContext(“本地[2]”)
rdd=sc.parallelize([MyMathObject(i)表示范围(5)中的i)])
rdd.map(lambda obj:obj.square()).collect()#此操作失败
这不起作用-它会导致一条很长的错误消息,对我来说,这几乎是毫无帮助的。 我觉得唯一有趣的一句话是:

AttributeError:无法在上获取属性“MyMathObject”

因此,它似乎与属性
square()
的调用方式有关。我在最后复制了完整的信息

Pyspark本身似乎也能工作;例如,在一个普通python列表上执行以下命令将返回预期的平方数

rdd=sc.parallelize([i代表范围(5)])
map(lambda i:i**2.collect()
因此,我创建或操作对象的方式似乎有缺陷,但我无法追踪错误

完整的错误消息:

Py4JJavaError回溯(最近一次调用) 在里面 1 rdd=sc.parallelize([MyMathObject(i)表示范围(5)中的i)]) ---->2 rdd.map(lambda obj:obj.square()).collect()

/collect(self)中的opt/apache-spark-3/spark-3.0.2-bin-hadoop3.2/python/pyspark/rdd.py 887 """ 888,使用SCCallSiteSync(self.context)作为css: -->889 sock\u info=self.ctx.\u jvm.PythonRDD.collectAndServe(self.\u jrdd.rdd()) 890返回列表(从套接字(sock\u信息,self.\u jrdd\u反序列化器)加载) 891

/调用中的opt/apache-spark-3/spark-3.0.2-bin-hadoop3.2/python/lib/py4j-0.10.9-src.zip/py4j/java_gateway.py(self,*args) 1302 1303 answer=self.gateway\u client.send\u命令(command) ->1304返回值=获取返回值( 1305应答,self.gateway\u客户端,self.target\u id,self.name) 1306

/get_return_值中的opt/apache-spark-3/spark-3.0.2-bin-hadoop3.2/python/lib/py4j-0.10.9-src.zip/py4j/protocol.py(答案、网关_客户端、目标_id、名称) 324值=输出\转换器[类型](回答[2:],网关\客户端) 325如果答案[1]==参考类型: -->326 raise Py4JJavaError( 327“调用{0}{1}{2}时出错。\n”。 328格式(目标id,“.”,名称),值)

Py4JJavaError:调用z:org.apache.spark.api.python.PythonRDD.collectAndServe时出错。 :org.apache.SparkException:作业因阶段失败而中止:阶段1.0中的任务0失败1次,最近的失败:阶段1.0中的任务0.0丢失(TID 2,192.168.2.108,执行器驱动程序):org.apache.spark.api.python异常:回溯(最近一次调用): 文件“/opt/apache-spark-3/spark-3.0.2-bin-hadoop3.2/python/lib/pyspark.zip/pyspark/worker.py”,主文件第605行 过程() 文件“/opt/apache-spark-3/spark-3.0.2-bin-hadoop3.2/python/lib/pyspark.zip/pyspark/worker.py”,第597行,正在处理中 序列化程序.dump_流(out_iter,outfile) 文件“/opt/apache-spark-3/spark-3.0.2-bin-hadoop3.2/python/lib/pyspark.zip/pyspark/serializers.py”,第271行,在dump_流中 vs=列表(itertools.islice(迭代器,批处理)) 文件“/opt/apache-spark-3/spark-3.0.2-bin-hadoop3.2/python/lib/pyspark.zip/pyspark/serializers.py”,第147行,在load_stream中 屈服自我。读取长度(流) 文件“/opt/apache-spark-3/spark-3.0.2-bin-hadoop3.2/python/lib/pyspark.zip/pyspark/serializers.py”,第172行,长度为 返回自加载(obj) 加载文件“/opt/apache-spark-3/spark-3.0.2-bin-hadoop3.2/python/lib/pyspark.zip/pyspark/serializers.py”,第458行 返回pickle.load(对象,编码=编码) AttributeError:无法在上获取属性“MyMathObject”

位于org.apache.spark.api.python.BasePythonRunner$readeriator.handlePythonException(PythonRunner.scala:503) 位于org.apache.spark.api.python.PythonRunner$$anon$3.read(PythonRunner.scala:638) 位于org.apache.spark.api.python.PythonRunner$$anon$3.read(PythonRunner.scala:621) 位于org.apache.spark.api.python.BasePythonRunner$readerierator.hasNext(PythonRunner.scala:456) 在org.apache.spark.interruptblediator.hasNext(interruptblediator.scala:37) 位于scala.collection.Iterator.foreach(Iterator.scala:941) 位于scala.collection.Iterator.foreach$(Iterator.scala:941) 在org.apache.spark.interruptblediator.foreach(interruptblediator.scala:28) 在scala.collection.generic.growtable.$plus$plus$eq(growtable.scala:62) 在scala.collection.generic.growtable.$plus$plus$eq$(growtable.scala:53) 在scala.collection.mutable.ArrayBuffer.$plus$plus$eq(ArrayBuffer.scala:105) 在scala.collection.mutable.ArrayBuffer.$plus$plus$eq(ArrayBuffer.scala:49) 在scala.collection.TraversableOnce.to处(TraversableOnce.scala:315) 在scala.collection.TraversableOnce.to$(TraversableOnce.scala:313) 在org.apache.spark.interruptableiterator.to(interruptableiterator.scala:28) 在scala.collection.TraversableOnce.toBuffer(TraversableOnce.scala:307) 位于scala.collection.TraversableOnce.toBuffer$(TraversableOnce.scala:307) 在org.apache.spark.interruptableiterator.toBuffer上(interruptableiterator.scala:28) 位于scala.collection.TraversableOnce.toArray(TraversableOnce.scala:294) 位于scala.collection.TraversableOnce.toArray$(TraversableOnce.scala:288) 在org.apache.spark.interruptableiterator.toArray上(interruptableiterator.scala:28) 在org.apache.spark.rdd.rdd.$anonfun$
class MyMathObject():
    def __init__(self, i):
        self.i = i
    def square(self):
        return self.i ** 2
from mymodule import MyMathObject

rdd = sc.parallelize([MyMathObject(i) for i in range(5)])
rdd.map(lambda obj: obj.square()).collect()