序列化Python类

提问

我有一个示例Python

class bean :
    def __init__(self, puid, pogid, bucketId, dt, at) :
    self.puid = puid
    self.pogid = pogid
    self.bucketId = bucketId
    self.dt = (datetime.datetime.today() - datetime.datetime.strptime(dt, "%Y-%m-%d %H:%M:%S")).days
    self.absdt=dt
    self.at = at

现在我知道在Java中使类可序列化,我们只需要扩展Serializable和ovverride一些方法即可,并且生活很简单.尽管Python非常简单,但是我找不到序列化此类对象的方法.

此类应可通过网络序列化,因为此调用的对象将转到apache spark,后者通过网络分配对象.

这样做的最好方法是什么.

我还发现了this,但不知道这是否是最好的方法.

我也看过

Classes, functions, and methods cannot be pickled — if you pickle an object, the object’s class is not pickled, just a string that identifies what class it belongs to.

那么这是否意味着那些类不能序列化?

PS:由于数据量巨大,因此将有数百万个此类的对象.因此,请提供两种解决方案之一,一种最简单而又最有效的方式.

编辑:

为了澄清起见,我必须使用类似

def myfun():
    **Some Logic **
    t1 = bean(<params>)
    t2 = bean(<params2>)
    temp = list()
    temp.append(t1)
    temp.append(t2)
    return temp

现在如何最终称呼它

PairRDD.map(myfun).collect()

引发异常

<function __init__ at 0x7f3549853c80> is not JSON serializable

最佳答案

只要传递给__init__的所有参数(puid,pogid,bucketId,dt,at)都可以序列化,就不需要任何其他步骤.如果遇到任何问题,很可能意味着您没有在集群上正确分配模块.

虽然PySpark会自动分发在闭包内部引用的变量和函数,但分发模块,库和类是您的责任.如果是简单类,则创建一个单独的模块并通过SparkContext.addPyFile传递它就足够了:

# https://www.python.org/dev/peps/pep-0008/#class-names
from some_module import Bean  

sc.addPyFile("some_module.py")