我使用Avro模式动态地从C#应用程序生成消息到Kafka集群,使用汇合的Kafka客户机。在编译时不知道数据类型,因此我使用avro.generic
命名空间中的GenericRecord类,如下所述:https://www.confluent.io/blog/decoupling-systems-with-apache-kafka-schema-registry-and-avro/。
但是,我有一个问题--如果模式有一个字段可以包含null值,仍然需要使用add方法将该字段添加到GenericRecord
中,将null作为值。我的应用程序不知道哪些字段可以为空,我认为不应该为空--因为这违反了模式中可为空字段的目的。
Avro架构:
{
"namespace": "Test",
"type": "record",
"doc": "Test bool type",
"name": "BoolType",
"version": "1",
"fields": [
{
"name": "Data",
"type": [ "null", "boolean" ],
"default": null
},
{
"name": "Source",
"type": "string"
}
]
}
C#代码:
var valueRecord = new GenericRecord( valueAvroSchema );
valueRecord.Add( "Data", null );
valueRecord.Add( "Source", "Test app .NET" );
var messageToSend = new Message<GenericRecord, GenericRecord>
{
Key = keyRecord,
Value = valueRecord
};
await _producer.ProduceAsync( _topicName, messageToSend );
如果行:
valueRecord.Add( "Data", null );
不存在,则ProduceAsync
方法抛出confluent.kafka.ProduceException
,如下面的屏幕截图所示。
是否有任何方法可以自动填充GenericRecord中可以为null的字段?如果我必须用缺省值填充字段,这也适用。
有没有什么方法可以用标准的方式来完成,或者我需要编写自己的代码来读取模式,如果有任何可为空的字段没有被我的应用程序设置,那么在发布之前在结尾处添加这些字段?
谢谢你!
Avro默认值仅与消费者相关。制作者必须始终设置每个字段
我使用的是NiFi(v1.2)处理器ConvertJSONToAvro。我无法解析一个“记录”类型中仅包含2个元素中的1个元素的记录。数据中也允许完全缺少该元素。我的Avro模式不正确吗? 架构片段: 如果“personname”同时包含“first”和“last”,它就可以工作,但是如果它只包含其中一个元素,它就会失败,错误是:无法转换字段personname:无法解析联合:{“last”:“S
有没有办法将 GenericRecord(我刚刚从 Kafka 消息中得到的)反序列化为嵌套 POJO?我实际上正在将其反序列化为 Scala 的案例类,但我意识到这更难。我通过互联网搜索,似乎每个人都在手动进行。您知道任何能够做到这一点的库吗?
我有以下对象: Bu 有时我只是我正在尝试为此提出一个架构。但它似乎:(不起作用。 我尝试了以下两种: 但它失败了,线程“main”org.apache.avro中出现<code>异常。SchemaParseException:无类型: 我也尝试了同样的错误: 我真的不明白问题出在哪里,两者有什么区别。
嘿,我想将ConFluent模式注册表与Avro Serializers一起使用:留档现在基本上是说:不要为多个不同的主题使用相同的模式 谁能解释一下原因吗?我重新搜索了源代码,它基本上将模式存储在Kafka主题中,如下所示(topicname,magicbytes,version- 因此,除了冗余之外,我看不到多次使用模式的问题?
问题内容: Android Studio 2.3.3 领域3.5.0 资源 RealmController.java SellingData.java 预期行为 获取领域默认实例。 实际行为 会崩溃。 问题答案: 如果您在设备上使用给定的架构创建一个Realm,则如果您开始修改架构(通过添加新类,添加新字段,删除字段,添加/删除,添加/删除,更改类型等),则您需要提供迁移(此处为示例),或者需要在
这实际上与我之前的问题相同,但使用Avro而不是JSON作为数据格式。 我正在使用一个Spark数据框架,它可以从几个不同的模式版本之一加载数据: 我正在使用Spark Avro加载数据。 它可能是版本一文件或版本二文件。但是我希望能够以相同的方式处理它,将未知值设置为“null”。我之前的问题中的建议是设置模式,但是我不想重复自己在文件中编写模式,也不想重复自己在和朋友中编写模式。如何将avro