Python 如何在dask数据帧中使用pyarrow将自定义类序列化为结构?

Python 如何在dask数据帧中使用pyarrow将自定义类序列化为结构?,python,parquet,dask,pyarrow,Python,Parquet,Dask,Pyarrow,我有一个dask dataframe,它有一列类型为List[MyClass]。我想将此数据框保存到拼花文件。Dask使用pyarrow作为后端,但它只支持基本类型 将熊猫作为pd导入 将dask.dataframe作为dd导入 类别MyClass: 定义初始化(self,a): self.a=a def变换(v): 返回[MyClass(v)] a=[[1]、[2]、[3]] pdf=pd.DataFrame.from_dict(a) ddf=dd.from_熊猫(pdf,npartition

我有一个dask dataframe,它有一列类型为List[MyClass]。我想将此数据框保存到拼花文件。Dask使用pyarrow作为后端,但它只支持基本类型

将熊猫作为pd导入
将dask.dataframe作为dd导入
类别MyClass:
定义初始化(self,a):
self.a=a
def变换(v):
返回[MyClass(v)]
a=[[1]、[2]、[3]]
pdf=pd.DataFrame.from_dict(a)
ddf=dd.from_熊猫(pdf,npartitions=1)
结果=ddf.assign(mycl=ddf[0]。应用(转换))
结果。到拼花地板(“我的拼花地板,拼花地板”)
因此,当我试图保存它时,会出现以下错误:

ArrowInvalid:推断Python对象集合的箭头数据类型时出错。已获取MyClass类型的Python对象,但只能处理以下类型:bool、float、integer、date、datetime、bytes、unicode、decimal


显然,我必须将
MyClass
转换为与pyarrow兼容的结构类型,但我找不到方法来实现这一点。Pyarrow&dask有一些序列化功能(如此),但这似乎不是我所需要的。

有点晚了,但也许这可以帮助其他人

它基本上归结为定义定制的手工序列化函数。例如,以下是您的课程:

class MyData:
    def __init__(self, name, data):
        self.name = name
        self.data = data
您可以编写与此类进行转换的函数,如下所示:

def _serialize_MyData(val):
    return {'name': val.name, 'data': val.data}

def _deserialize_MyData(data):
    return MyData(data['name'], data['data']
然后初始化这些函数中的上下文,以便稍后提供给序列化/反序列化方法:

context = pa.SerializationContext()
context.register_type(MyData, 'MyData',
                      custom_serializer=_serialize_MyData,
                      custom_deserializer=_deserialize_MyData)
现在调用
序列化
/
反序列化
方法并将上下文传递给它们:

buf = pa.serialize(val, context=context).to_buffer()
restored_val = pa.deserialize(buf, context=context)

您准备好自己处理序列化(classbytes)并只存储字节了吗?不,我想用dask/pandas进行序列化,用spark进行反序列化。由于pyarrow中还不支持复杂模式,因此我决定使用json作为本例的中间格式。spark现在处理json吗?我以前没有。在任何情况下,如果这解决了问题,我会很高兴(请随意发布答案),但我很惊讶,因为我认为您想要存储python类。您知道是否有一种方法可以反序列化部分数据吗?例如,如果数据很大,我只想提取名称,有没有办法从序列化数据中提取名称?