是否可以在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
值,但我试图表达的是类似于“如果那些字段名不存在,或者如果它们存在并且它们为null或string,则此JSON有效”。
这可以用Avro模式来表达吗?如果可以,如何表达?
2条答案
按热度按时间46scxncf1#
你可以把默认属性定义为未定义的示例.所以该字段可以被跳过.
此外,所有字段在avro中都是强制性的。如果您希望它是可选的,则将其类型与null合并。例如:
mbzjlibv2#
根据avro规范,这是可能的,使用default属性。
参见https://avro.apache.org/docs/1.8.2/spec.html
default:此字段的默认值,在读取缺少此字段的示例时使用(可选)。允许的值取决于字段的方案类型,如下表所示。联合字段的默认值对应于联合中的第一个方案。
在你给出的例子中,你确实添加了默认属性"null",所以这应该可以工作。然而,支持这一点也取决于你用来读取avro消息的库(在c,c++,python,java,c#,ruby等语言中都有库)。也许(很可能)你使用的库缺乏这一特性。