未应用布尔值的avro默认值

时间:2020-03-19 06:57:55

标签: 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
        } 
}

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

1 个答案:

答案 0 :(得分:1)

这不仅与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)

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


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

我也尝试过使用 Golang ,结果是相同的。