我正在以编程方式创建模式,这是一个要求,使用
SchemaBuilder
例如:
Schema s = SchemaBuilder.record(collectionName).namespace("com.company.something").fields()
.name(field).type().nullable().stringType().noDefault()
...
.endRecord();
然而,这会创建一个没有默认值的可为空字段。我想将其默认为空。 我不明白如何使用API来设置默认值,除了字符串默认值,例如使用
stringDefault("default")
代替 noDefault()
。不幸的是,参数不能为空。
这个API是如何实现的?
Avro 中的可为 null 字段是字段类型 + null 类型的联合。由于某种原因,可以为空的字段,例如
.name(field).type().nullable().stringType()
,生成一个模式,其中并集为 ["string", "null"]
。
看起来联合体的第一种类型可以控制默认值,所以像上面这样的联合体可以有默认的字符串值,但不能有默认的空值。为此,您需要一个
["null", "string"]
工会。
为此,您使用的 API 构造不起作用。你需要这样的东西:
.name(field).type().unionOf().nullType().and().stringType().endUnion().nullDefault()
从 API 中找出它可能会更困难,因为您需要意识到代码片段中也使用了联合,并且在尝试之前必须首先使用 null。由于问题中的片段和这个看起来非常不同,人们会感到困惑。