Scala And Avro: преобразование класса дела в запись avro - PullRequest
0 голосов
/ 14 марта 2019

Я использую Scala 2.12 и Avro (org.apache.avro) 1.8.

У меня есть следующая схема:

Schema: {"name": "person","type": "record","fields": [{"name": "address","type": {"type" : "record","name" : "AddressUSRecord","fields" : [{"name": "streetaddress", "type": "string"},{"name": "city", "type":"string"}]}}]}

Соответствующие классы случаев Scala:

case class AddressUSRecord (streetaddress: String, name: String}

case class Address (addressUSRecord: List[AddressUSRecord])

case class Person (person: Address)

Я использую GenericRecord для преобразования моего объекта класса дела PnlRecord в Avro.

val schema = new Schema.Parser().parse(new File(schemaFileName))
val avroRecord = new GenericData.Record(schema)
val writer = new GenericDatumWriter[GenericRecord](schema)
val out = new ByteArrayOutputStream()
val encoder = EncoderFactory.get().binaryEncoder(out, null)
val producer = new KafkaProducer[String, Array[Byte]](properties)
avroRecord.put("header", record.header)
//Please note that this pnlData (see above case class) is complex and created accordingly.
avroRecord.put("pnlData", record.pnlData)
writer.write(avroRecord, encoder)
val bytes = out.toByteArray
encoder.flush()
out.close()

Я получаю следующую ошибку.

2019-03-13 21:57:29.832 [application-akka.actor.default-dispatcher-4] ERROR controllers.SAController.$anonfun$publishToSA$2(34) - ca.company.project.sa.model.MessageHeader cannot be cast to org.apache.avro.generic.IndexedRecord
java.lang.ClassCastException: ca.company.project.sa.model.MessageHeader cannot be cast to org.apache.avro.generic.IndexedRecord
        at org.apache.avro.generic.GenericData.getField(GenericData.java:697)
        at org.apache.avro.generic.GenericData.getField(GenericData.java:712)
        at org.apache.avro.generic.GenericDatumWriter.writeField(GenericDatumWriter.java:164)
        at org.apache.avro.generic.GenericDatumWriter.writeRecord(GenericDatumWriter.java:156)
        at org.apache.avro.generic.GenericDatumWriter.writeWithoutConversion(GenericDatumWriter.java:118)
        at org.apache.avro.generic.GenericDatumWriter.write(GenericDatumWriter.java:75)
        at org.apache.avro.generic.GenericDatumWriter.writeField(GenericDatumWriter.java:166)
        at org.apache.avro.generic.GenericDatumWriter.writeRecord(GenericDatumWriter.java:156)
        at org.apache.avro.generic.GenericDatumWriter.writeWithoutConversion(GenericDatumWriter.java:118)
        at org.apache.avro.generic.GenericDatumWriter.write(GenericDatumWriter.java:75)
        at org.apache.avro.generic.GenericDatumWriter.write(GenericDatumWriter.java:62)

Почему мой класс дела MessageHeaderнельзя привести к IndexedRecord?Что мне здесь не хватает?

Как преобразовать такой сложный класс case в объект avro?Может ли кто-нибудь помочь с таким примером вложенного класса case для преобразования в запись avro?

Заранее спасибо.

1 Ответ

0 голосов
/ 20 марта 2019

Confluent Kafka Avro serializer основан на Java и, как таковой, скорее всего, не предназначен для работы с объектами Scala. Я вижу, что ваш pnlBreakdown объявлен как List[PnlBreakdown] - если это список Scala, сериализатор даже не распознает его как коллекцию. То же самое относится и к классам случаев - они не будут распознаваться как Java Beans без @BeanProperty аннотаций

...