是否可以在 Avro 模式中有一个可选字段(即该字段根本不会出现在 .json 文件中)?
Posted
技术标签:
【中文标题】是否可以在 Avro 模式中有一个可选字段(即该字段根本不会出现在 .json 文件中)?【英文标题】:Is it possible to have an optional field in an Avro schema (i.e. the field does not appear at all in the .json file)? 【发布时间】:2015-05-31 17:13:39 【问题描述】:是否可以在 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 或字符串,则此 JSON 有效。
这可以在 Avro 模式中表达吗?如果有,怎么做?
【问题讨论】:
我遇到了同样的问题。你找到解决办法了吗? @red1ynx 不幸的是没有。我仍然无法使用 Avro 模式表达完全可选的 JSON 字段。 我也为此苦苦挣扎。见***.com/questions/45193729/… 您可能需要添加一些代码来说明如何从 json 解析到 avro 【参考方案1】:您可以将默认属性定义为未定义的示例。 因此可以跳过该字段。
"name": "first_name",
"type": "string",
"default": "undefined"
,
在 avro 中所有字段都是强制性的。 如果您希望它是可选的,则将其类型与 null 联合。 示例:
"name": "username", "type": [ "null", "string" ], "default": null ,
【讨论】:
【参考方案2】:根据 avro 规范,这是可能的,使用 default 属性。
见https://avro.apache.org/docs/1.8.2/spec.html
default:此字段的默认值,在读取缺少此字段的实例时使用(可选)。根据下表,允许的值取决于字段的架构类型。联合字段的默认值对应于联合中的第一个模式。
在您给出的示例中,您确实添加了值为“null”的默认属性,所以这应该可以工作。但是,支持这一点还取决于您用于读取 avro 消息的库(在 c、c++、python、java、c#、ruby 等中有库)。也许(可能)您使用的库缺少此功能。
【讨论】:
以上是关于是否可以在 Avro 模式中有一个可选字段(即该字段根本不会出现在 .json 文件中)?的主要内容,如果未能解决你的问题,请参考以下文章
GenericRecord 的 Avro 架构:能够保留空白字段