如何在Avro解串器中挂钩逻辑类型的转换?

时间:2019-10-15 16:12:04

标签: apache-kafka avro confluent-schema-registry

我正在寻找有关如何进行转换的相同信息。当前,转换始终为null,并且在使用逻辑类型时无法转换为BigDecimal。但是,我可以在自动生成的存根类中看到以下转换。但是反序列化器读取的对象类型始终是ByteBuffer,并引发Class Cast Exception。

在自动生成的存根文件中(为清晰起见而设置):

import org.apache.avro.data.Conversions
import org.apache.avro.data.TimeConversions
protected static final TimeConversions.DateConversion DATE_CONVERSION = new TimeConversions.DateConversion(); 
protected static final TimeConversions.TimeConversion TIME_CONVERSION = new TimeConversions.TimeConversion(); 
protected static final TimeConversions.TimestampConversion TIMESTAMP_CONVERSION = new TimeConversions.TimestampConversion(); 
protected static final Conversions.DecimalConversion DECIMAL_CONVERSION = new Conversions.DecimalConversion();

而且,SpecificDatumReader readField()中的Conversion始终为NULL。

Conversion conversion = ((SpecificRecordBase)).getConversion(f.pos());

Avro版本现在为1.8.2,带有Confluent平台和注册表。

如何在解串器中设置转换?

1 个答案:

答案 0 :(得分:0)

我需要更多的上下文来确切说明问题所在-除非您正在编写序列化程序,否则通常不会自己打getConversion()

字段->转换器的查找在实际生成的类中;寻找这个:private static final org.apache.avro.Conversion<?>[] conversions

此转换表似乎仅适用于序列化。反序列化时,您需要注册转换。我不确定为什么会这样,但是您应该能够通过在启动时添加以下代码来解决该问题,该代码应注册所需的转换。

SpecificData.get().addLogicalTypeConversion(new Conversions.DecimalConversion());
SpecificData.get().addLogicalTypeConversion(new TimeConversions.DateConversion());
SpecificData.get().addLogicalTypeConversion(new TimeConversions.TimeConversion());
SpecificData.get().addLogicalTypeConversion(new TimeConversions.TimestampConversion());

根据确切的代码路径,您可能还需要在GenericData.get()...上调用该代码