Kafka AVRO - 从长到日期时间的转换
Kafka AVRO - conversion from long to datetime
当我想发送包含 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。此错误在处理 AVRO 消息并在控制台中打印它们的 Spark 作业中抛出。在AVRO schema中,对应的字段是这样定义的:
{\"name\": \"event_time\", \"type\": { \"type\" : \"long\", \"logicalType\": \"timestamp-millis\"}}
在.avsc
文件生成的Javaclass中,字段定义如下:
private DateTime event_time;
我在使用 Confluent 4.0.0 和 Avro 1.8.2 时遇到了类似的问题。我有一个试图将 long 转换为 DateTime 的流处理器。我通过添加正确的转换克服了这个问题。在开始任何处理逻辑之前,我使用了 Specific Data 静态实用程序 class 并添加了正确的逻辑类型转换。
SpecificData.get().addLogicalTypeConversion(new TimeConversions.TimestampConversion());
在 Avro 1.9.X 及更高版本中,符号 TimestampConversion
不再存在。用 TimestampMillisConversion
替换上面的 @user3222582 为我修复了 avro 1.9.2
的编译错误
尝试将 avro 版本升级到 1.9.X avro 依赖和 avro-maven-plugin pom.xml
<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 模式中删除之前生成的 class 并执行 mvn 编译。
当我想发送包含 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。此错误在处理 AVRO 消息并在控制台中打印它们的 Spark 作业中抛出。在AVRO schema中,对应的字段是这样定义的:
{\"name\": \"event_time\", \"type\": { \"type\" : \"long\", \"logicalType\": \"timestamp-millis\"}}
在.avsc
文件生成的Javaclass中,字段定义如下:
private DateTime event_time;
我在使用 Confluent 4.0.0 和 Avro 1.8.2 时遇到了类似的问题。我有一个试图将 long 转换为 DateTime 的流处理器。我通过添加正确的转换克服了这个问题。在开始任何处理逻辑之前,我使用了 Specific Data 静态实用程序 class 并添加了正确的逻辑类型转换。
SpecificData.get().addLogicalTypeConversion(new TimeConversions.TimestampConversion());
在 Avro 1.9.X 及更高版本中,符号 TimestampConversion
不再存在。用 TimestampMillisConversion
替换上面的 @user3222582 为我修复了 avro 1.9.2
尝试将 avro 版本升级到 1.9.X avro 依赖和 avro-maven-plugin pom.xml
<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 模式中删除之前生成的 class 并执行 mvn 编译。