Авро Схема с Кафкой, ClassCastException? - PullRequest
0 голосов
/ 24 апреля 2019

Я создал схему Avro для записей, которые мы публикуем в нашей теме Kafka.Наша фактическая схема записи Kafka более сложная, но я просто приложил соответствующие части для краткости.У нас есть более одного вложенного подкласса в записи, но по какой-то причине я получаю следующее исключение при попытке опубликовать запись (имена пакетов скрыты):

java.lang.ClassCastException: aaa.bbb.ccc.ddd.Amount cannot be cast to org.apache.avro.generic.IndexedRecord

class KafkaRecord {

    private Amount amount;

    class Amount {

        String currency;
        long value;

    }

}

И это текущее подмножество из схемы Avro, которую я определил.


{
  "type" : "record",
  "name" : "KafkaRecord",
  "namespace" : "com.company.department",
  "fields" : [ {
    "name" : "amount",
    "type" : {
      "type" : "record",
      "name" : "Amount",
      "namespace" : "aaa.bbb.ccc.ddd",
      "fields" : [ {
        "name" : "value",
        "type" : "long"
      }, {
        "name" : "currency",
        "type" : "string"
      } ]
    }
  }
}

Наше JSON-представление объекта (KafkaRecord) выглядит так:

{
  "amount": {
    "currency": "GBP",
    "value": 12345
  }
}

Iне могу понять, почему Avro не нравится эта вложенная запись, и я бы предпочел не разбирать эти вложенные классы, так как это сделало бы запись JSON очень трудной для чтения и сложной для управления классами.

Если кто-нибудь сможет указать, что я здесь делаю неправильно, это было бы здорово!

1 Ответ

0 голосов
/ 30 апреля 2019

Ну, вам не нужно писать свои собственные файлы Java. Звучит так, как вы, и поэтому ошибка, как говорится, - Amount класс не IndexedRecord

Например, если я беру вашу схему и запускаю

java -jar ~/Downloads/avro-tools-1.8.2.jar compile schema KafkaRecord.avsc .

Затем посмотрите на файл, мы видим, что он расширяет некоторые классы Java Avro.

$ head -n 15 aaa/bbb/ccc/ddd/Amount.java
/**
 * Autogenerated by Avro
 *
 * DO NOT EDIT DIRECTLY
 */
package aaa.bbb.ccc.ddd;

import org.apache.avro.specific.SpecificData;
import org.apache.avro.message.BinaryMessageEncoder;
import org.apache.avro.message.BinaryMessageDecoder;
import org.apache.avro.message.SchemaStore;

@SuppressWarnings("all")
@org.apache.avro.specific.AvroGenerated
public class Amount extends org.apache.avro.specific.SpecificRecordBase implements org.apache.avro.specific.SpecificRecord {

Способ сделать это программно описан в руководстве Avro Maven Plugin .

И да, Avro отлично работает с вложенными записями, и лично мне нравится , использующий IDL для более простого их создания

@namespace("com.company.department")
protocol KafkaEventProtocol {
  @namespace("aaa.bbb.ccc.ddd")
  record Amount {
    string currency;
    long value;
  }

  record KafkaValue {
    Amount amount;
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...