具有默认null值的Avro logicalType'日期'

dje*_*son 4 java schema avro apache-kafka

我需要在Avro架构中将'null'默认值添加到logicalType:'date'。我当前的定义是这样的:

{
 "type": "record",
 "namespace": "my.model.package",
 "name": "Person",
 "version": "1",
 "fields": [
    {"name":"birthday","type": { "type": "int", "logicalType": "date"}}
 ]
}
Run Code Online (Sandbox Code Playgroud)

当我用'birthday'字段填充时,org.joda.time.LocalDate它确实起作用,但是当我离开它时null,出现以下异常:

org.apache.kafka.common.errors.SerializationException: Error serializing Avro message
Caused by: java.lang.NullPointerException: null of int of my.model.package.Person
at org.apache.avro.generic.GenericDatumWriter.npe(GenericDatumWriter.java:145)
at org.apache.avro.generic.GenericDatumWriter.writeWithoutConversion(GenericDatumWriter.java:139)
at org.apache.avro.generic.GenericDatumWriter.write(GenericDatumWriter.java:75)
at org.apache.avro.generic.GenericDatumWriter.write(GenericDatumWriter.java:62)
at io.confluent.kafka.serializers.AbstractKafkaAvroSerializer.serializeImpl(AbstractKafkaAvroSerializer.java:92)
at io.confluent.kafka.serializers.KafkaAvroSerializer.serialize(KafkaAvroSerializer.java:53)
at org.apache.kafka.clients.producer.KafkaProducer.doSend(KafkaProducer.java:459)
at org.apache.kafka.clients.producer.KafkaProducer.send(KafkaProducer.java:436)
...
Run Code Online (Sandbox Code Playgroud)

我尝试了多种方法将此“ logicalType”配置为可为空,但无法使其正常工作。如何将该字段配置为可为空?

小智 11

这段代码对我有用:

{
    "name" : "birthday",
    "type" : ["null",{
      "type" : "int",
      "logicalType": "date"
    }]
}
Run Code Online (Sandbox Code Playgroud)

  • 我不知道为什么这被否决了,但我遵循了这个并且它起作用了。 (3认同)

小智 5

Avro尚不支持逻辑类型的并集。这是一个已知的未解决问题:https : //issues.apache.org/jira/browse/AVRO-1891

虽然一点也不优雅,但我处理此问题的方式是使用诸如1900-01-01之类的前哨值来表示null。