Avro到带有嵌套类型的Scala案例类注释
我正在对Kafka上的消息使用Avro序列化,并使用当前使用的一些自定义Scala代码进行处理。以下是具有嵌套记录的基本架构:Avro到带有嵌套类型的Scala案例类注释,scala,avro,Scala,Avro,我正在对Kafka上的消息使用Avro序列化,并使用当前使用的一些自定义Scala代码进行处理。以下是具有嵌套记录的基本架构: { "type": "record", "name": "TestMessage", "namespace": "", "fields": [ {"name": "message", "type": "string"}, { "name": "metaData", "type": { "type":
{
"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
和版本0.4.5
中得到解决
请记住,对于模式中的每个记录类型,都需要一个case类来表示它。对于Scala 2.10,必须首先定义嵌套最多的类。安全定义如下:
@AvroTypeProvider("schema-common/TestMessage.avsc")
@AvroRecord
case class MetaData()
@AvroTypeProvider("schema-common/TestMessage.avsc")
@AvroRecord
case class TestMessage()
嗨@derdc,很抱歉你遇到了这个。我还没有在Kafka测试台上尝试过,但实际上我得到了一个错误,即涉及类元数据的非法循环引用。结果表明,所有具有嵌套记录的测试用例都来自
.avro
文件中的模式,而不是.avsc
文件,显然它们之间存在我遗漏的差异。我希望在接下来的几天内有时间来解决这个问题,同时你可以使用,或者一次性使用(爱好者帐户,可能加载速度慢)。太棒了,朱利安!刚刚测试了更新,可以确认所有工作。你是开源社区的功劳