有没有一种方法可以反序列化PyArrow表模式?

3
我一直在使用PyArrow表格作为几个数据源和Parquet文件之间的中间步骤。as_table pa.Table.from_pylist(my_items)非常有用,但它不允许进行任何真正的验证。您可以对生成的Table调用as_table.validate(),但它只针对自己推断的类型进行验证,并且不会捕获任何关于非空字段的内容。
我可以手动创建一堆模式,一个pa.Field接一个pa.Field,但其中一些很大或者有点复杂。我希望能够从已知的良好规范示例创建对象,序列化生成的模式(或执行某些代码生成或其他保存方式),然后使用它来验证未来的读取和写入。模式对象具有.serialize()方法的事实是令人心动的:
s = pa.Table.from_pylist(known_good_objects).schema
serialized = s.serialize().to_pybytes()
# What's in here? 
print(serialized)
b'\xff\xff\xff\xff\x99\x21\x...'

好的,这是某种二进制事物。我已经多次查阅了官方文档,但并没有什么帮助。尝试使用各种类型的UTF对字节进行.decode()失败了,我也找不到任何等效的.deserialize()方法来执行任何预期的操作。我能在这里使用一些IPC魔法吗?我可以只是将结果对象pickle化并稍后加载它们吗?从内存中的对象重用或生成pyarrow模式的路径是什么?

1个回答

4

Schema.serialize() 方法将模式序列化为 IPC 消息,如文档字符串中所述(https://arrow.apache.org/docs/python/generated/pyarrow.Schema.html#pyarrow.Schema.serialize),即使用 Arrow 的序列化规范(https://arrow.apache.org/docs/format/Columnar.html#serialization-and-interprocess-communication-ipc)。

确实没有很好的文档说明如何反序列化这样的消息(用户指南 https://arrow.apache.org/docs/python/ipc.html 仅显示了实际记录批数据而不是单个模式消息)。但是您可以使用 pyarrow.ipc 模块来处理 IPC 消息,如果您知道自己有一个模式消息,可以使用 read_schema

>>> schema = pa.schema([("col1", pa.int64()), ("col2", pa.float64())])
>>> schema
col1: int64
col2: double

>>> schema_serialized = schema.serialize().to_pybytes()
>>> pa.ipc.read_schema(pa.py_buffer(schema_serialized))
col1: int64
col2: double


话虽如此,如果您想将其序列化仅用于 Python 项目/脚本中的临时存储,就像您提到的那样,您也可以使用 pickle:

>>>import pickle
>>> pickle.loads(pickle.dumps(schema))
col1: int64
col2: double

IPC消息协议是与语言无关的(不仅限于Python,因此您可以将此模式消息与非Python库共享),并且在Python / Pyarrow版本之间保持稳定。但根据您的需求,pickle可能足够并且更容易使用。


这太棒了,谢谢。除了代码生成来创建 schema(field, field, field...) 之外,似乎这是最好的选择。 - a p

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接