Python 在自实现对象/类的函数上使用Pysparks rdd.parallelize().map()
我有一些我想并行计算的对象,所以我想我可以求助于pyspark 考虑这个例子,一个类的对象有一个数字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
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()