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

记录缺少字段时出现Avro架构问题

华献
2023-03-14

我使用的是NiFi(v1.2)处理器ConvertJSONToAvro。我无法解析一个“记录”类型中仅包含2个元素中的1个元素的记录。数据中也允许完全缺少该元素。我的Avro模式不正确吗?

架构片段:

"name": "personname",
"type": [
  "null":,
  {
    "type": "record",
    "name": "firstandorlast",
    "fields": [
        {
          "name": "first",
          "type": [
            "null",
            "string"
          ]
        },
        {
          "name": "last",
          "type": [
            "null",
            "string"
          ]
        }
      ]
  }
] 

如果“personname”同时包含“first”和“last”,它就可以工作,但是如果它只包含其中一个元素,它就会失败,错误是:无法转换字段personname:无法解析联合:{“last”:“Smith”}不在“type”:[“null”:,{“type”:“record”,“name”:“FirstandLast”,“fields”:[{“name”:“first”,“type”:[“null”,“string”]},{“name”:“last”,“type”:[“null”,“string”]}]

共有1个答案

齐航
2023-03-14

您缺少默认值

https://avro.apache.org/docs/1.8.1/spec.html#schema_record

您的模式应该看起来像

"name": "personname",
"type": [
  "null":,
  {
    "type": "record",
    "name": "firstandorlast",
    "fields": [
        {
          "name": "first",
          "type": [
            "null",
            "string"
          ],
          "default": "null"
        },
        {
          "name": "last",
          "type": [
            "null",
            "string"
          ],
          "default": "null"
        }
      ]
  }
] 
 类似资料:
  • 我使用Avro模式动态地从C#应用程序生成消息到Kafka集群,使用汇合的Kafka客户机。在编译时不知道数据类型,因此我使用命名空间中的GenericRecord类,如下所述:https://www.confluent.io/blog/decoupling-systems-with-apache-kafka-schema-registry-and-avro/。 但是,我有一个问题--如果模式有一

  • 我有一个问题,我的记录json可以为null。如何处理avro模式中的空记录?给出的文档是针对我想要为null记录获取的null属性的。

  • 我正在尝试反序列化/读取avro文件,Avro数据文件没有新字段。即使新字段在模式中被声明为null,它也应该是可选的。但是它仍然给我一个强制性的错误。 线程“main”org . Apache . avro . avrotypeexception中出现异常:找到com.kiran.avro.User,应为com.kiran.avro.User,缺少必需字段loc AVRO 架构声明: 使用代码读

  • 我正在尝试使用TopologyTestDriver测试kafka流。我分享代码片段和我面临的错误。 Error org.apache.kafka.common.errors.SerializationException: Error serializing Avro message Suppressed: java.lang.IllegalArgumentException: 請總是: 在每次測試

  • 在此avro模式中 当我试着给名字分配多个值,比如多个记录... 它总是为模式中的NAME字段指定Null...除了我放入的第一条记录...有没有方法可以将default用作字符串...如果没有字符串,那么它只使用模式中提到的Null 如上所述,联合是使用JSON数组表示的。例如,[“string”,“null”]声明一个模式,该模式既可以是字符串,也可以是null。 联合不能包含多个具有相同类型

  • 更新:spark avro软件包已更新以支持此场景。https://github.com/databricks/spark-avro/releases/tag/v3.1.0 我有一个AVRO文件,它是由我无法控制的第三方创建的,我需要使用spark进行处理。AVRO模式是一个记录,其中一个字段是混合联合类型: 这是不支持的火花avro阅读器: 除了上面列出的类型之外,它还支持读取三种类型的联合类型