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

Avro模式验证

全弘深
2023-03-14

根据Avro模式规范(适用于接头):https://avro.apache.org/docs/current/spec.html

如上所述,Unions使用JSON数组表示。例如,["null","string"]声明一个模式,该模式可以是null或string。

请注意,当为类型为联合的记录字段指定默认值时,默认值的类型必须与联合的第一个元素匹配。

因此,对于包含“null”的联合,通常首先列出“null”,因为此类联合的默认值通常为null。)

根据标准,在声明联合时,第一个单词必须是默认值,第二个单词必须是数据类型。

在我们的产品中,我们使用Avro编码,具有以下架构:

{
      "name": "data",
      "type": {
        "name": "data",
        "type": "record",
        "fields": [
          {
            "name": "data_asset",
            "type": ["string", "null"],
            "default": null,
            "doc": "The serialized JSON describing the entity - can be null for special cases"
          }
        ]
      }
    }

我们发现,虽然工会有一个“必须”的要求,即第一项是默认项,但当我们颠倒顺序([“string”,“null”])时,模式验证器不会抛出任何错误,如上所示。

我的问题是:为什么验证通过了,即使按照标准它是“不正确的”?

共有1个答案

杜河
2023-03-14

这种情况下,实现与规范不匹配。有些库可能会实现此检查,因此最好确保您的模式与规范匹配,即使您使用的特定库没有检查它。

 类似资料:
  • 我有两个问题: > 我曾尝试使用模式V1编写记录,并使用模式V2读取记录,但出现以下错误: org.apache.avro。AvroTypeException:找到foo,应为foo 我使用avro-1.7.3和: 以下是这两种模式的示例(我也尝试过添加命名空间,但没有成功)。 架构V1: 架构V2: 提前谢谢。

  • 我正试图了解更多关于我们在Kafka主题中使用的Avro模式的信息,我对这一点相对来说比较陌生。 我想知道是否有一种方法可以在特定情况下发展模式。我们用一个不能为null的新字段或任何默认值来更新模式,因为这些新字段是标识符。解决这个问题的方法是创建新主题,但是有没有更好的方法来改进现有模式?

  • 我将JSON文件&JSON模式解析为AVRO模式。我有点困惑,我是否必须使用AVRO文档中定义的数据类型来编写手动AVRO模式。 或者是否有任何自动化的方法/函数/程序可以完全按照要求工作?

  • 考虑到模式和(反)序列化框架的可用性,我认为构建一个能够实现以下功能的系统是很简单的: 它通过HTTP get请求接收输入 将其转换/解析/反序列化为python对象 验证给定公共模式语言描述的python对象 对参数进行一些操作以获取结果数据 将结果数据序列化为JSON 验证结果 归还它 我想使用一种语言不可知的模式语言——任何只在一种语言中使用的语言。我将avro和json模式视为模式语言和(

  • 因此,我们计划使用Avro在融合的Kafka生态系统上进行交流。我目前对Avro的理解是,每条消息都有自己的模式。如果是这样的话,我们需要模式注册表来解决版本更新吗? 我问,因为在每条消息中携带模式可以防止需要像模式注册表这样的东西来将消息ID映射到模式。还是我在这里错过了什么?

  • 根据Avro文档中“default”属性的定义:“此字段的默认值,用于读取缺少此字段的实例(可选)。” 这意味着,如果缺少相应的字段,则采用默认值。 但事实似乎并非如此。考虑下面的<代码>学生<代码>模式: 模式表示:如果“年龄”字段丢失,则将值视为-1。“名称”字段也是如此。 现在,如果我尝试从以下JSON构建学生模型: 我得到一个例外: 看起来默认设置未按预期工作。那么,违约的作用到底是什么呢