Apache Avro 联合​​类型

Pas*_*002 0 avro

我正在使用Avro 1.11.0库使用Python 3.7将数据写入 Avro 文件。我对 Avro 的联合类型有一些疑问。请在下面找到两个架构。

{
    "name" : "name",
    "type" : ["null", "string"],
    "columnName" : "name",
}

{
    "name" : "name",
    "type" : ["string", "null"],
    "columnName" : "name",
}
Run Code Online (Sandbox Code Playgroud)

第一个架构包含联合类型 as "type" : ["null", "string"],第二个架构包含联合类型 as "type" : ["string", "null"]。那么上面提到的模式有什么区别吗?

小智 5

唯一的区别是,规范规定,如果要使用默认值,它应该对应于联合中的第一个类型。

例如,这些是有效的:

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

{
    "name" : "name",
    "type" : ["string", "null"],
    "columnName" : "name",
    "default": "foo",
}
Run Code Online (Sandbox Code Playgroud)

但这些不会:

{
    "name" : "name",
    "type" : ["null", "string"],
    "columnName" : "name",
    "default": "foo",
}

{
    "name" : "name",
    "type" : ["string", "null"],
    "columnName" : "name",
    "default": null,
}
Run Code Online (Sandbox Code Playgroud)

由于包含 null 的联合往往意味着类似于可选字段的内容,因此大多数人会将 null 作为联合中的第一个选项,以便他们可以将默认值设置为 null。