Flink的通用Avro反序列化器:覆盖getProducedType

时间:2018-04-04 11:04:19

标签: scala deserialization apache-flink avro

我想创建一个Generic Avro Deserializer并将其与Kafka / Flink一起使用。

要做到这一点,我必须从Flink API扩展DeserializationSchema:

import java.io.ByteArrayInputStream

import com.sksamuel.avro4s.{AvroInputStream, FromRecord, SchemaFor, ToRecord}
import org.apache.flink.api.common.serialization.DeserializationSchema
import org.apache.flink.api.common.typeinfo.TypeInformation
import org.apache.flink.api.java.typeutils.TypeExtractor

class FidesGenericAvroDeserializer[T](implicit schema: SchemaFor[T], toRecord: ToRecord[T], fromRecord: FromRecord[T])
  extends DeserializationSchema[T] {

  override def isEndOfStream(nextElement: T): Boolean = false

  override def deserialize(message: Array[Byte]): T = {
    AvroInputStream.binary[T](new ByteArrayInputStream(message)).iterator.toSeq.head
  }

  override def getProducedType: TypeInformation[T] = TypeExtractor.getForClass(classOf[T])
}

这样做会导致编译问题,因为T似乎不是一个类:

class type required but T found
override def getProducedType: TypeInformation[T] = TypeExtractor.getForClass(classOf[T])

1 个答案:

答案 0 :(得分:1)

我回答我自己的问题。我必须将ClassTag强制类型与asInstanceOf一起使用,但现在可以使用:

import java.io.ByteArrayInputStream

import com.sksamuel.avro4s.{AvroInputStream, FromRecord, SchemaFor, ToRecord}
import org.apache.flink.api.common.serialization.DeserializationSchema
import org.apache.flink.api.common.typeinfo.TypeInformation
import org.apache.flink.api.java.typeutils.TypeExtractor

import scala.reflect.ClassTag
import scala.reflect._

class FidesGenericAvroDeserializer[T: ClassTag](implicit schema: SchemaFor[T], toRecord: ToRecord[T], fromRecord: FromRecord[T])
  extends DeserializationSchema[T] {

  override def isEndOfStream(nextElement: T): Boolean = false

  override def deserialize(message: Array[Byte]): T = {
    AvroInputStream.binary[T](new ByteArrayInputStream(message)).iterator.toSeq.head
  }

  override def getProducedType: TypeInformation[T] =
    TypeExtractor.getForClass(classTag[T].runtimeClass).asInstanceOf[TypeInformation[T]]

}