我们正在将表数据从db2发送到iidr cdc,再发送到kafka。当您看到kafka avro console consumer中的消息时,kafka主题中的数据格式有问题。
对于定义为default null的db2列,如果它们的值为null,则在kafka主题中看起来很好(如下所示)key:value) . 但当值不为null时,它将被 Package 在字典中。
列为-
"Random_key": {
"int": 9088245671
}
这里,该条目的键是列的数据类型,值是列值。-->这种输出格式不适合我们的应用程序
如果值实际为null,并且列定义为default null,则看起来很好。正如所料-
"Random_key": null
我们如何在iidr cdc或kafka侧进行更改,以便始终在中显示消息key:value format ,如下所示-(即使默认null列中包含某个值)
"Random_key": 9088245671
谢谢!
1条答案
按热度按时间zf2sa74q1#
这很正常,这意味着
Random_key
是类型的avro记录Union
. 带着一个union
类型您必须设置一个与联合类型匹配的默认值,并且在您的情况下,您的cdc被解释为数据库字段模式约束union { null, int}
.当字段不为null时,意味着它是一个整数,而在avro中,当它是并集时,必须指定相应的类型。想象一下如果你有这个:
union {string, int, double}
. 这里的字段是正确的,当它是一个字符串,一个整数或一个双精度,但我们想知道每个字段什么是真正的数据类型。不幸的是,这是正确的行为,但通常你并不在乎。
avro-console-consumer
使用json序列化程序打印数据以便能够读取。在您的代码中,字段数据类型将被正确地解释为您想要的类型。编辑:如果您的业务绝对需要一个json格式的记录,那么有一个人想用更易阅读的json来更改表示形式,并开发了一套编码器/解码器来代替默认值:
https://github.com/zolyfarkas/avro/commit/8926d6e9384eb3e7d95f05a9d1653ba9348f1966