我尝试使用Avro格式的Spark结构化流媒体将数据加载到Kafka。我已经尝试设置默认的Confluent序列化器和反序列化器(io.confluent.kafka.serializers.AbstractKafkaAvroSerDe
),文档说我们可以使用字符串或二进制Serde。
我试图将JSON值转换为Avro字节流并将其传递给值字段以将其推送到Kafka。
请在下面找到将JSON转换为Avro的代码。
def getAvro(row: String, schema: String): Array[scala.Byte] = {
val parser = new Schema.Parser
val schema1 = parser.parse(schema)
val byteinput = new ByteArrayInputStream(row.getBytes)
val din = new DataInputStream(byteinput)
val decoder = DecoderFactory.get().jsonDecoder(schema1, din)
val reader = new GenericDatumReader(schema1)
def test[T <: AnyRef](o: Option[T]): T = o getOrElse null.asInstanceOf[T]
val nullPass= test(None)
val datum = reader.read(test(None), decoder)
val outputStream = new ByteArrayOutputStream()
val e = EncoderFactory.get().binaryEncoder(outputStream, test(None))
new GenericDatumWriter(schema1).write(datum, e)
e.flush()
return outputStream.toByteArray()
当我尝试运行此操作时,我收到以下错误:
java.lang.ClassCastException:
org.apache.avro.generic.GenericData$Record cannot be cast to
scala.runtime.Nothing$ at stream$.getAvro(stream.scala:36) at
stream$$anonfun$getAvro1$1$1.apply(stream.scala:71) at
stream$$anonfun$getAvro1$1$1.apply(stream.scala:71) ... 16 more
任何形式的帮助都将受到赞赏。