有没有办法将无头 Avro 消息写入文件,而无需在 Python 中反序列化其二进制内容?

Is there a way to write a headless Avro message to a file without deserializing its binary contents in Python?

提问人:Hercules Konsoulas 提问时间:10/25/2023 更新时间:10/25/2023 访问量:28

问:

我正在使用 Oracle 数据库来存储不同架构的一些 Avro 消息,这些消息表示我的应用程序中的一些 Kafka 事件。由于消息有多种类型,因此我使用一个包含几列的表,并将其整个正文存储在名为 的 CLOB 列中。我现在需要将所有这些消息导出到有效的 Avro 消息的不同文件中。BODY

当我使用类似的东西从数据库中获取这些数据时:

# Return string or bytes instead of a locator (for CLOBs e.g. event.body)
oracledb.defaults.fetch_lobs = False

...

cursor.execute(
    'select body from EVENTS' +
    (f" where EVENT_TYPE='{event_type}'" if event_type else "") +
    " order by CREATED_ON"
)
for body in cursor:
    filename = fr'./exported_events/event_{SOME_UNIQUE_ID}.avro'
    os.makedirs(os.path.dirname(filename), exist_ok=True)
    with open(filename, 'wb+') as file:
        fastavro.writer(
                file,
                fastavro_schema.load_schema(fr"./event_{event_type}.avsc"),
                [body]
        )

我收到一个错误,说基本上是一个无法迭代的对象。 这似乎我应该先序列化正文,然后再反序列化它,以便将其写入 avro 文件中。bodybytes

有没有办法避免这种情况?

我也尝试过将 转换为字典,但这样做时出现的问题是我的消息包含和类型显然被模块错误地转换,然后在使用架构进行验证时引发错误。bodyjson.dumps(body)bytearraystimestamp-millisjson

Python avro 二进制文件 fastavro

评论

0赞 Scott 10/25/2023
结果是fastavro.schemaless_writer吗?body
0赞 Hercules Konsoulas 10/25/2023
@Scott 是 Java 应用程序持久化的无头 avro 消息,为什么?body
1赞 Scott 10/26/2023
只是确保我理解正确。目前,没有办法获取无头 avro 消息并将其转换为带有标头和所有内容的标准 avro 容器。因此,目前您必须使用 fastavro.schemaless_reader 进行解码,然后使用 fastavro.writer 进行重新编码。fastavro
0赞 Hercules Konsoulas 10/27/2023
这就是我要问的,是否有其他方法可以避免您刚才描述的内容,但感谢您的确认。:)

答: 暂无答案