是否可以在Avro架构中有一个可选字段(即该字段在.json文件中根本不显示)?

时间:2015-03-27 11:25:59

标签: json avro

是否可以在Avro架构中有一个可选字段(即该字段在.JSON文件中根本不显示)?

在我的Avro架构中,我有两个字段:

{"name": "author", "type": ["null", "string"], "default": null},
{"name": "importance", "type": ["null", "string"], "default": null},

在我的JSON文件中,这两个字段可以存在与否。

但是,当它们不存在时,我收到一个错误(例如,当我使用avro-tools命令行客户端测试这样的JSON文件时):

Expected field name not found: author

我了解只要字段名称存在于JSON中,它可以是nullstring值,但我想表达的是类似于“如果那些字段名称不存在,则此JSON有效,或者如果它们存在并且它们为空或字符串”,则为“。”

这可以用Avro架构表达吗?如果是这样,怎么样?

2 个答案:

答案 0 :(得分:3)

您可以将默认属性定义为未定义的示例。 因此可以跳过该字段。

{ "name": "first_name", "type": "string", "default": "undefined" },

所有字段在avro中都是必填项。 如果希望它是可选的,则将其类型与null合并。 例如:

  {
    "name": "username",
    "type": [
      "null",
      "string"
    ],
    "default": null
  },

答案 1 :(得分:2)

根据avro规范,可以使用默认属性。

请参见https://avro.apache.org/docs/1.8.2/spec.html

  

默认值:此字段的默认值,在读取缺少此字段的实例时使用(可选)。根据下表,允许的值取决于字段的架构类型。联合字段的默认值对应于联合中的第一个架构。

在您给出的示例中,确实添加了默认属性,其值为“ null”,因此应该可以使用。但是,是否支持此功能还取决于您用于读取avro消息的库(在c,c ++,python,java,c#,ruby等处有库)。也许(可能)您使用的库缺少此功能。