提问
我有一个示例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")