是否可以在 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 中,它可以是 nullstring 值,但我要表达的是类似于“如果这些字段名称不存在,或者如果它们存在并且它们为 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 文件中)?的主要内容,如果未能解决你的问题,请参考以下文章

avro 模式中的可选数组

GenericRecord 的 Avro 架构:能够保留空白字段

如何在 Avro 中将记录与地图混合?

如果字段顺序更改,Avro 模式不兼容

使用 Databricks 将十进制字段加载到 Redshift 表时出现 Avro 文件错误

Avro 模式中的多态性和继承