在 scala 中,来自泛型的 Avro 序列化

in scala, Avro Serialization from generics

提问人:alexmoon 提问时间:11/16/2023 最后编辑:dtolnayalexmoon 更新时间:11/22/2023 访问量:32

问:

我正在准备使用 scala 从 spark 中的泛型进行 avro 记录反序列化的实用程序。

implicit class enericRecordImprovements(rdd: RDD[GenericRecord]) {
    def process[T : TypeTag : ClassTag]: RDD[T] = rdd.map(d => initCaseClassWithGenericRecord[T](d))
}



def initCaseClassWithGenericRecord[T](r: GenericRecord)(implicit mf: TypeTag[T], mf2: ClassTag[T]): T = {
    val schema = AvroSchema[T]
    val schemaFor: SchemaFor[T] = SchemaFor.apply(schema)

    implicit val encoder: Encoder[T] = Encoder[T].withSchema(schemaFor)
    implicit val decoder: Decoder[T] = Decoder[T].withSchema(schemaFor)

    val format = RecordFormat[T]
    format.from(r)
  }

首先,我只使用 RecordFormat,但我在构建时遇到了错误,就像这样。

could not find implicit value for evidence parameter of type com.sksamuel.avro4s.Encoder[T]
one error found

因此,我定义了 Encoder、Decoder、SchemaFor 和 AvroSchema,如上所述,它们在隐式参数中使用。

然后发生此错误。

could not find implicit value for parameter schemaFor: com.sksamuel.avro4s.SchemaFor[T]
one error found

我认为,原因可能是泛型。 因此,我尝试通过ClassTag,TypeTag查找val schema = AvroSchema[T]的类型参数。但是我无法解决这个问题..

请提供任何使用泛型反序列化 Avro 记录工作的提示。谢谢。

scala 版本 : 2.12 AVRO4S:2.12_4.1.1

Scala 反序列化 Avro

评论

0赞 Luis Miguel Mejía Suárez 11/16/2023
而不是要求和要求ClassTagTypeTagAvroEncoder

答: 暂无答案