有没有一种将Avro模式编译成Python类的方法?

11

我很好奇是否有一种与Java或C ++实现相同的方式来处理Avro Python。

根据官方的Avro Python文档,我必须在运行时提供一个Avro模式来对数据进行编码/解码。但是是否有一种使用代码生成器的方法,就像Java / C ++中所做的那样?

4个回答

3

更新:我的同事编写了一个非常好的库来完成这个任务,avro-to-python。我们已经在一些相当复杂的模式上使用它进行生产超过一年了。

我必须为php实现类似的东西:avro-to-php


2

Pyschema 是一个不错的起点,但是文档较差。您需要查看源代码才能了解其工作原理。您可以使用它来读取 Avro 模式并生成 Python 源代码。它添加了另一层抽象,因此会稍微降低速度。


2
最近我在 Pulsar Slack 频道里问了几次这个问题,我相信目前没有任何工具可以将 Avro 模式转换为与 Pulsar Python 客户端库兼容的 Python 类。
Pulsar Python 客户端库要求 Python 类继承 Record 类(https://github.com/apache/pulsar/blob/master/pulsar-client-cpp/python/pulsar/schema/definition.py#L57),并且 Python 类中的每个字段都必须继承自 Field 类(https://github.com/apache/pulsar/blob/master/pulsar-client-cpp/python/pulsar/schema/definition.py#L141),这两个类都是在 Pulsar Python 客户端库中定义的。
因此,一个 Avro 到 Python 的转换器需要从 Python 客户端库中导入 Record 类和 Field 类。如果这样的转换器存在,那么 Pulsar Slack 社区中的某个人应该知道它的存在。
此外,Pulsar Python客户端库缺少对Avro关键字(如“doc”、“namespace”)和null默认值的支持。因此,即使存在将Avro转换为Python的转换器,转换后的Python类也可能无法被Pulsar Python客户端库正确消费。

1

我在文档中没有看到任何关于将Avro模式转换为Python类代码生成器的迹象(文档明确提到了Java情况下的代码生成),适用于任意的Python解释器。如果您正在使用Jython,可以使用Java代码生成器创建一个类,在Jython代码中访问它。

与Java和C++不同,缺少代码生成不会对Python性能产生太大影响(至少在CPython情况下),因为类实例基于字典实现(在某种意义上有例外,但它们主要改变了内存使用,而不是总是涉及字典查找的事实)。这使得代码生成在开发中主要是“好看”的语法糖,而不是必需的功能;通过一些努力,您总是可以实现一个转换器,编写出一个class定义,并在Python中eval它以获得类似的效果(这就是如何定义collections.namedtuple类的方法)。


1
谢谢你的帮助。但这真的很遗憾。我们将为Kaa IoT平台实现Python SDK。按照设计,Kaa SDK通过生成相应的Java/C++类来配置几个Avro模式。对于C SDK,我们已经实现了自己的Avro生成器,以使用普通的C结构体代替Avro datum。 通过使用这种方法,Avro模式仅在生成SDK的阶段需要。之后,开发人员仅使用预编译的类,而不知道任何模式结构。 - user1627760
我不明白为什么这种方法不能在Python中实现。当前的Python实现效率非常低下,代码生成可以显著提高速度。 - Charles

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