未应用布尔值的 avro 默认值

Meg*_*dad 7 java boolean default avro

我有一个 avro 模式,其中我已将捕获声明为布尔值,并且我想将默认值指定为true

{
    "namespace": "abc",
    "type": "record",
    "name": "Request",
    "fields": [
        {
            "name": "amount",
            "type": "long",
        },
        {
            "name": "currency",
            "type": ["string", "null"],
        },
        {
            "name": "capture",
            "type": "boolean",
            "default": true
        } 
}
Run Code Online (Sandbox Code Playgroud)

当在 Java 中使用它时,它会获得默认值null。我需要做什么才能将其默认为true

gre*_*lea 5

这不仅仅与Java有关。一般来说(根据https://avro.apache.org/docs/current/spec.html上提供的文档)我们有:

default: A default value for this field, used when reading instances that lack this field (optional)
Run Code Online (Sandbox Code Playgroud)

因此,默认值仅用于模式演变,因此当您使用不同模式读取/写入记录时。例如,假设您想要读取使用模式 A1 写入的记录,而使用演变的模式 A2 ,并且捕获字段已通过模式 A2 引入(因此它在模式 A1 中不存在)。因此,您读取的记录包含该变量的架构 A2 的默认值。


为了测试,我从一个模式生成了两个Java类,分别具有一个布尔字段,默认值为“true”和“false”。除了 Avro 模式定义之外,生成的类是相同的。这确认默认值未反映在源代码中。

我也尝试过Golang,结果是一样的。