0

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

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

如果列是示例输出 -

"Random_key": {
    "int": 9088245671
  }

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

如果该值实际上是 null 并且列定义为 DEFAULT NULL,它看起来很好。果然不出所料——

 "Random_key": null 

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

"Random_key": 9088245671

谢谢!

4

1 回答 1

1

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

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

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

编辑:如果您的业务绝对需要 json 格式的记录,那么有人想要更改更易读的 json 的表示并开发了一组编码器/解码器,以代替默认的:

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

于 2018-12-12T18:19:24.717 回答