Serialization 如何编写自定义PySpark序列化程序

Serialization 如何编写自定义PySpark序列化程序,serialization,pyspark,pickle,Serialization,Pyspark,Pickle,我想编写一个定制的pyspark序列化程序。除了细节之外,网上几乎没有什么文档 我的逻辑如下: 如果我收到我的特殊对象,那么我使用自定义逻辑来序列化/反序列化 否则,请使用cPickle进行相同操作 自定义序列化程序如下所示: 从pyspark.serializers导入FramedSerializer 类CustomSerializer(FramedSerializer): 作为腌菜进口cPickle 导入自定义类 def转储(自身、obj): 如果isinstance(对象,自定义类):

我想编写一个定制的
pyspark
序列化程序。除了细节之外,网上几乎没有什么文档

我的逻辑如下:

  • 如果我收到我的特殊对象,那么我使用自定义逻辑来序列化/反序列化
  • 否则,请使用
    cPickle
    进行相同操作
自定义序列化程序如下所示:

从pyspark.serializers导入FramedSerializer
类CustomSerializer(FramedSerializer):
作为腌菜进口cPickle
导入自定义类
def转储(自身、obj):
如果isinstance(对象,自定义类):
字节\u str=obj.serialize()
字节\u str='\1'+字节\u str
elif isinstance(对象,CustomClass.Location):
字节\u str=obj.serialize()
字节\u str='\2'+字节\u str
其他:
字节\u str=pickle.dumps(obj)
字节\u str='\0'+字节\u str
返回字节
def加载(自身,字节数):
c=字节数\u str[0]
如果c=='\1':
obj=CustomClass()
obj.parse_from_string(bytes_str[1:])
elif c=='\2':
obj=CustomClass.Location()
obj.parse_from_string(bytes_str[1:])
其他:
obj=pickle.load(字节\u str[1:])
返回obj
在启动
SparkContext
时,我确保指定自定义序列化程序:

serializer=CustomSerializer()
sc=SparkContext(appName='MyApp',serializer=serializer)
但是,我仍然得到错误:

Caused by: org.apache.spark.api.python.PythonException: Traceback (most recent call last):
  File "/mnt/yarn/usercache/user/appcache/application_1507044435666_0035/container_1507044435666_0035_01_000002/pyspark.zip/pyspark/worker.py", line 174, in main
    process()
  File "/mnt/yarn/usercache/user/appcache/application_1507044435666_0035/container_1507044435666_0035_01_000002/pyspark.zip/pyspark/worker.py", line 169, in process
    serializer.dump_stream(func(split_index, iterator), outfile)
  File "/mnt/yarn/usercache/user/appcache/application_1507044435666_0035/container_1507044435666_0035_01_000002/pyspark.zip/pyspark/serializers.py", line 272, in dump_stream
    bytes = self.serializer.dumps(vs)
  File "<ipython-input-2-536808351108>", line 14, in dumps
PicklingError: Can't pickle <class 'CustomClass.Location'>: attribute lookup Location failed
原因:org.apache.spark.api.python.python异常:回溯(最近一次调用):
文件“/mnt/thread/usercache/user/appcache/application_1507044435666_0035/container_1507044435666_0035_01_000002/pyspark.zip/pyspark/worker.py”,主文件第174行
过程()
文件“/mnt/thread/usercache/user/appcache/application_1507044435666_0035/container_1507044435666_0035_01_000002/pyspark.zip/pyspark/worker.py”,第169行,处理中
serializer.dump_流(func(拆分索引,迭代器),outfile)
文件“/mnt/thread/usercache/user/appcache/application_1507044435666_0035/container_1507044435666_0035_01_000002/pyspark.zip/pyspark/serializers.py”,第272行,位于转储流中
字节=self.serializer.dumps(vs)
文件“”,第14行,转储
PicklingError:无法pickle:属性查找位置失败
我错过了什么


谢谢。

他的问题解决了吗?