具有嵌套类型的 Avro 到 Scala case class 注释
Avro to Scala case class annotation with nested types
我目前正在使用 Avro 序列化 Kafka 上的消息,并使用 this annotation method 使用一些自定义 Scala 代码进行处理。以下是带有嵌套记录的基本模式:
{
"type": "record",
"name": "TestMessage",
"namespace": "",
"fields": [
{"name": "message", "type": "string"},
{
"name": "metaData",
"type": {
"type": "record",
"name": "MetaData",
"fields": [
{"name": "source", "type": "string"},
{"name": "timestamp", "type": "string"}
]
}
}
]
}
还有注释,我相信应该看起来很简单:
@AvroTypeProvider("schema-common/TestMessage.avsc")
@AvroRecord
case class TestMessage()
消息本身类似于以下内容:
{"message":"hello 1",
"metaData":{
"source":"postman",
"timestamp":"123456789"
}
}
然而,当我记录 TestMessage 类型或在控制台的 Kafka 消费者中查看输出时,我所看到的是:
{"message":"hello 1"}
而不是我添加的用于捕获元数据的子类型。我有什么想念的吗?让我知道是否可以提供更多信息 - 谢谢!
现在应该在 Scala 2.11 的 0.10.3
版本和 Scala 2.10
的 0.4.5
版本中修复此问题
请记住,对于架构中的每种记录类型,都需要有一个案例 class 来表示它。对于 Scala 2.10,嵌套最多的 classes 必须首先定义。安全定义如下:
@AvroTypeProvider("schema-common/TestMessage.avsc")
@AvroRecord
case class MetaData()
@AvroTypeProvider("schema-common/TestMessage.avsc")
@AvroRecord
case class TestMessage()
我目前正在使用 Avro 序列化 Kafka 上的消息,并使用 this annotation method 使用一些自定义 Scala 代码进行处理。以下是带有嵌套记录的基本模式:
{
"type": "record",
"name": "TestMessage",
"namespace": "",
"fields": [
{"name": "message", "type": "string"},
{
"name": "metaData",
"type": {
"type": "record",
"name": "MetaData",
"fields": [
{"name": "source", "type": "string"},
{"name": "timestamp", "type": "string"}
]
}
}
]
}
还有注释,我相信应该看起来很简单:
@AvroTypeProvider("schema-common/TestMessage.avsc")
@AvroRecord
case class TestMessage()
消息本身类似于以下内容:
{"message":"hello 1",
"metaData":{
"source":"postman",
"timestamp":"123456789"
}
}
然而,当我记录 TestMessage 类型或在控制台的 Kafka 消费者中查看输出时,我所看到的是:
{"message":"hello 1"}
而不是我添加的用于捕获元数据的子类型。我有什么想念的吗?让我知道是否可以提供更多信息 - 谢谢!
现在应该在 Scala 2.11 的 0.10.3
版本和 Scala 2.10
0.4.5
版本中修复此问题
请记住,对于架构中的每种记录类型,都需要有一个案例 class 来表示它。对于 Scala 2.10,嵌套最多的 classes 必须首先定义。安全定义如下:
@AvroTypeProvider("schema-common/TestMessage.avsc")
@AvroRecord
case class MetaData()
@AvroTypeProvider("schema-common/TestMessage.avsc")
@AvroRecord
case class TestMessage()