是否可以在Avro模式中有一个可选字段(即该字段根本不出现在.json文件中)?

um6iljoc  于 2023-02-01  发布在  其他
关注(0)|答案(2)|浏览(185)

是否可以在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值,但我试图表达的是类似于“如果那些字段名不存在,或者如果它们存在并且它们为null或string,则此JSON有效”。
这可以用Avro模式来表达吗?如果可以,如何表达?

46scxncf

46scxncf1#

你可以把默认属性定义为未定义的示例.所以该字段可以被跳过.

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

此外,所有字段在avro中都是强制性的。如果您希望它是可选的,则将其类型与null合并。例如:

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

mbzjlibv2#

根据avro规范,这是可能的,使用default属性。
参见https://avro.apache.org/docs/1.8.2/spec.html
default:此字段的默认值,在读取缺少此字段的示例时使用(可选)。允许的值取决于字段的方案类型,如下表所示。联合字段的默认值对应于联合中的第一个方案。
在你给出的例子中,你确实添加了默认属性"null",所以这应该可以工作。然而,支持这一点也取决于你用来读取avro消息的库(在c,c++,python,java,c#,ruby等语言中都有库)。也许(很可能)你使用的库缺乏这一特性。

相关问题