首页 > 解决方案 > 如何指定名称以数字开头的python faust.Record字段?

问题描述

我通过扩展 faust.Record 类来描述浮士德模型。我的输入 json 看起来像:

{
  "1": "some_string"
  "2": "some_string"
}

所以我必须创建类字段,只用数字命名。我知道,它通常在 Python 中受到限制,但是有没有解决方法,比如我的 fieds 名称的别名?

我在 Java 中寻找类似 Jackson 注释的东西:

import faust

class Model(faust.Record, serializer='json'):
    @alias(field_name: '1')
    first_name: str
    @alias(field_name: '2')
    last_name: str

标签: pythonjsonfaust

解决方案


如果没有适当的数据模型,就没有简单的方法可以神奇地挽救一个主题。

你永远不应该在没有数据模型的情况下写入 kafka 主题。

正如@OneCricketeer 建议的那样,您应该将未定义的主题作为字典摄取。

之后,您可以编写一个使用该主题的代理,将您的模型转换为适当的数据模型并将其写入主题。

class Person(faust.Record):
    first_name: str
    last_name: str

现在您可以按预期开始使用您的 eg Person 模型了。

undeclared_json_topic = app.topic('name_of_your_input_topic')
person_topic = app.topic('person', value_type=Person)

@app.agent(undeclared_json_topic)
async def migrate_to_person(json_stream: faust.Stream) -> faust.Stream[Person]:
    async for json in json_stream:
        person = Person(first_name=json['1'], last_name=json['2'])
        await person_topic.send(value=person)
        yield

推荐阅读