我不能在下面的课上泡菜。我使用的是数据块6.5ML(包括ApacheSpark2.4.5,Scala2.11)
import pickle
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
p1 = Person("John", 36)
pickle.dump(p1,open('d.pkl','wb'))```
PicklingError: Can't pickle <class '__main__.Person'>: attribute lookup Person on __main__ failed发布于 2021-04-18 20:05:40
来自这里的可能答案
问题是,您正在尝试从定义对象的模块中提取对象。如果您将类移动到一个单独的文件中,并将其导入到您的脚本中,那么它应该可以工作。
不过,这个解决方案对我来说在iPython笔记本上是行不通的。在这里,我将从这里获得一些额外的信息
Python的泡菜实际上不序列化类:它会序列化实例,并在序列化中添加对每个实例类的引用,而该引用基于绑定到定义良好的模块中的名称的类。因此,没有模块名称但在其他类中作为属性存在的类的实例,或者列表和字典中的数据,通常不会工作。一个直截了当的事情,一个人可以尝试做的是尝试使用迪尔而不是泡菜。它是一个第三方包,它的工作方式类似于“泡菜”,但是它有扩展来实际序列化任意的动态类。虽然使用dill可能会帮助其他人到达这里,但这不是您的情况,因为为了使用dill,您必须对底层的RPC机制( PySpark使用dill而不是泡菜)进行修改,这可能不够简单,也不足以满足生产使用的需要。如果问题确实是关于动态创建的类是不可选的,那么您可以做的是为动态类本身创建额外的元类,而不是使用"type",在这些元类上创建适当的getstate和setstate (或其他帮助方法,就像泡菜文档中的那样)--这可能使这些类能够被普通的Pickle腌制。也就是说,使用Pickler助手方法代替类型(.,(object,),.)的独立元类。在你的密码里。但是,“不可选择的对象”不是您所得到的错误--它是一个属性查找错误,这表明您正在构建的结构不够好,不能让Pickle对其进行反思,并从您的一个实例中获取所有成员--它与类对象的不可挑选性无关。由于您的动态类在类上作为属性存在(类本身并不是泡沫化的),而不是实例中的属性,所以泡菜很有可能不关心它。检查上面泡菜上的文档,也许您所需要的是正确的助手--对您的类进行腌制的方法,在元类上没有什么不同,您所拥有的一切都可以正常工作。
发布于 2022-03-07 21:06:16
不要定义一个类,而是尝试定义一个NamedTuple。
import pickle
from collections import namedtuple
Person = namedtuple("Person", "name age")
p1 = Person("John", 36)
pickle.dump(p1,open('d.pkl','wb'))发布于 2022-06-23 11:04:05
我的解决方案:
将类人放入单独的例如"utility.py“
import utility
import pickle
new_person = pickle.loads(pickle.dumps(utility.Person()))它解决了我的内核问题!
https://datascience.stackexchange.com/questions/74172
复制相似问题