具有默认空值的 AvrologicalType 'date'

Posted

技术标签:

【中文标题】具有默认空值的 AvrologicalType \'date\'【英文标题】:Avro logicalType 'date' with default null value具有默认空值的 AvrologicalType 'date' 【发布时间】:2018-08-28 11:48:51 【问题描述】:

我需要在我的 Avro 架构中为 logicalType: 'date' 添加一个 'null' 默认值。我目前的定义是这样的:


 "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”配置为可为空,但无法使其正常工作。如何将此字段配置为可为空?

【问题讨论】:

可以提供工作示例代码来复制错误吗?特别是您如何填充记录 【参考方案1】:

这段代码对我有用:


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

【讨论】:

我不知道为什么这被否决了,但我遵循了这个并且它奏效了。 因为它并不总是有效。【参考方案2】:

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

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

-- 更新--

这个问题似乎从 1.9.0 版开始修复

【讨论】:

【参考方案3】:

声明为:


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

这应该可以工作

【讨论】:

以上是关于具有默认空值的 AvrologicalType 'date'的主要内容,如果未能解决你的问题,请参考以下文章

Impala 添加具有默认值的列

弹性搜索:索引具有空值的日期字段

在除前两列之外的每列上前向填充具有最新非空值的空值

VBScript:将具有空值的参数传递给存储过程?

如何获取数据集中具有空值的列的总数? [复制]

具有空键和空值的 HashMap