当我想发送包含类型为long的字段的AVRO消息时,出现以下错误:
Caused by: org.apache.kafka.common.errors.SerializationException: Error deserializing Avro message for id 61
Caused by: java.lang.ClassCastException: java.lang.Long cannot be cast to org.joda.time.DateTime
我使用Confluent 3.2.0和Apache Spark 2.2.0。此错误在Spark作业中引发,该作业处理AVRO消息并在控制台中打印它们。在AVRO模式中,相应的字段定义如下:
{\"name\": \"event_time\", \"type\": { \"type\" : \"long\", \"logicalType\": \"timestamp-millis\"}}
在从.avsc
文件生成的Java类中,该字段定义如下:
private DateTime event_time;
答案 0 :(得分:4)
我在使用Confluent 4.0.0和Avro 1.8.2时遇到了类似的问题。我有一个流处理器试图将long转换为DateTime。我通过添加正确的转换克服了这个问题。在开始任何处理逻辑之前,我使用了Specific Data静态实用程序类并添加了正确的逻辑类型转换。
SpecificData.get().addLogicalTypeConversion(new TimeConversions.TimestampConversion());
答案 1 :(得分:0)
在Avro 1.9.X及更高版本中,不再出现符号TimestampConversion
。用TimestampMillisConversion
将@ user3222582中的内容替换为avro 1.9.2为我解决了编译错误
答案 2 :(得分:0)
尝试将avro的版本以avro依赖性升级到1.9.X,并将pom.xml中的avro-maven-plugin升级
<dependency>
<groupId>org.apache.avro</groupId>
<artifactId>avro</artifactId>
<version>1.9.1</version>
</dependency>
<plugin>
<groupId>org.apache.avro</groupId>
<artifactId>avro-maven-plugin</artifactId>
<version>1.9.1</version>
<executions>
<execution>
<phase>generate-sources</phase>
<goals>
<goal>schema</goal>
<!--<goal>idl-protocol</goal>-->
</goals>
<configuration>
<sourceDirectory>${project.basedir}/src/main/avro</sourceDirectory>
<outputDirectory>${project.basedir}/src/main/java</outputDirectory>
<enableDecimalLogicalType>true</enableDecimalLogicalType>
<stringType>String</stringType>
</configuration>
</execution>
</executions>
</plugin>
还要确保从AVRO模式中删除以前生成的类,并进行mvn编译。