我正在寻找一个示例,在类似于SpecificRecordBase
的Avro GenericRecordBase
对象上执行Bijection,或者是否有更简单的方法将AvroSerializer
类用作Kafka键和值串行器。
Injection<GenericRecord, byte[]> genericRecordInjection =
GenericAvroCodecs.toBinary(schema);
byte[] bytes = genericRecordInjection.apply(type);
答案 0 :(得分:1)
https://github.com/miguno/kafka-storm-starter提供了此类示例代码。
例如,请参阅AvroDecoderBolt。从它的javadocs:
此螺栓需要Avro编码的二进制格式的传入数据,根据
T
的Avro架构进行序列化。它会将传入的数据反序列化为T
pojo,并将此pojo发送给下游消费者。因此,对于Avro数据,这个螺栓可以被认为是类似于Twitter Bijection的Injection.invert[T, Array[Byte]](bytes)
。
,其中
的子类
T
:基于正在使用的基础Avro架构的Avro记录的类型(例如Tweet
)。必须是Avro的SpecificRecordBase
。
代码的关键部分是(我将代码折叠到此代码段中):
// With T <: SpecificRecordBase
implicit val specificAvroBinaryInjection: Injection[T, Array[Byte]] =
SpecificAvroCodecs.toBinary[T]
val bytes: Array[Byte] = ...; // the Avro-encoded data
val decodeTry: Try[T] = Injection.invert(bytes)
decodeTry match {
case Success(pojo) =>
System.out.println("Binary data decoded into pojo: " + pojo)
case Failure(e) => log.error("Could not decode binary data: " + Throwables.getStackTraceAsString(e))
}
答案 1 :(得分:0)
Schema.Parser parser = new Schema.Parser();
Schema schema = parser.parse(new File("/Users/.../schema.avsc"));
Injection<Command, byte[]> objectInjection = SpecificAvroCodecs.toBinary(schema);
byte[] bytes = objectInjection.apply(c);