IIDR CDC Kafka消息格式

IIDR CDC Kafka message format

我们正在将 table 数据从 db2 发送到 iidr-cdc 到 kafka 。当您在 kafka-avro-console-consumer 中看到消息时,我们遇到了 Kafka 主题中数据格式的问题。

对于定义为 DEFAULT NULL 的 Db2 列,如果它们的值为 null,它在 kafka 主题中看起来很好(如 key:value)。但是当值不为 null 时,它被包装在字典中。

示例输出,如果列是 -

"Random_key": {
    "int": 9088245671
  }

这里,该条目的键是列的数据类型,值是列值。 --> 这种输出格式不适合我们的应用程序

如果该值实际上为 null 并且列定义为 DEFAULT NULL,则看起来不错。 符合预期 -

 "Random_key": null 

我们如何在 IIDR CDC 或 KAFKA 端进行更改以始终以 key:value 格式显示消息,如下所示 - (即使 DEFAULT NULL 列包含列中的某些值)

"Random_key": 9088245671

谢谢!

正常,说明字段Random_key是一条Union类型的avro记录。 对于 union 类型,您必须设置一个与联合类型匹配的默认值,在您的情况下,您的 CDC 将数据库字段架构约束解释为 union { null, int}

当该字段不为空时,这意味着它是一个整数,而在 avro 中,当它是一个联合时,您必须指定相应的类型。 想象一下,如果你有这个:union {string, int, double}。这里的字段是字符串、整数或双精度时是正确的,但我们想知道每个字段的数据的真实类型是什么。

不幸的是,这是正确的行为,但通常您并不关心它。 avro-console-consumer 使用 json 序列化程序打印数据以便您能够阅读。在您的代码中,字段数据类型将按照您希望的方式正确解释。

编辑: 如果您的业务绝对需要 json 格式的记录,有人想要将表示更改为更具可读性 json 并开发了一组 encoder/decoder 来代替默认格式:

https://github.com/zolyfarkas/avro/commit/8926d6e9384eb3e7d95f05a9d1653ba9348f1966