簡體   English   中英

Avro 邏輯類型“日期”,默認為空值

[英]Avro logicalType 'date' with default null value

我需要向我的 Avro 架構中的 logicalType: 'date' 添加一個“空”默認值。 我目前的定義是這樣的:

{
 "type": "record",
 "namespace": "my.model.package",
 "name": "Person",
 "version": "1",
 "fields": [
    {"name":"birthday","type": { "type": "int", "logicalType": "date"}}
 ]
}

當我使用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)
...

我嘗試了很多方法來將此“logicalType”配置為可為空,但無法使其正常工作。 如何將此字段配置為可為空?

這段代碼對我有用:

{
    "name" : "birthday",
    "type" : ["null",{
      "type" : "int",
      "logicalType": "date"
    }]
}

Avro 尚不支持邏輯類型的聯合。 這是一個已知的未決問題: https : //issues.apache.org/jira/browse/AVRO-1891

雖然一點也不優雅,但我處理這個問題的方法是使用一個標記值,例如 1900-01-01 來表示 null。

-- 更新 --

這個問題似乎從 1.9.0 版開始修復

將其聲明為:

{
  "name": "myOptionalDate",
  "type": ["null","int"],
  "logicalType": "date",
  "default" : "null" 
}

這應該有效

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM