是否可以在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中,它可以是null
或string
值,但我想表达的是类似于“如果那些字段名称不存在,则此JSON有效,或者如果它们存在并且它们为空或字符串”,则为“。”
这可以用Avro架构表达吗?如果是这样,怎么样?
答案 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等处有库)。也许(可能)您使用的库缺少此功能。