在scala中将Json字符串转换为Avro会导致ClassCastException

时间:2017-08-30 08:54:56

标签: json scala apache-spark apache-kafka spark-structured-streaming

我尝试使用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

任何形式的帮助都将受到赞赏。

0 个答案:

没有答案