当前位置: 首页 > 知识库问答 >
问题:

Avro架构GenericRecord缺少键

柴瀚昂
2023-03-14

我使用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的字段?如果我必须用缺省值填充字段,这也适用。

有没有什么方法可以用标准的方式来完成,或者我需要编写自己的代码来读取模式,如果有任何可为空的字段没有被我的应用程序设置,那么在发布之前在结尾处添加这些字段?

谢谢你!

共有1个答案

陈实
2023-03-14

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