簡體   English   中英

Avro Schema與Kafka,ClassCastException?

[英]Avro Schema with Kafka, ClassCastException?

我已經為我們發布到Kafka主題的記錄創建了一個Avro架構。 我們實際的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
  }
}

我似乎無法弄清楚為什么Avro不喜歡這個嵌套記錄,我寧願不拆開這些嵌套類,因為它會使JSON記錄很難閱讀並且難以管理類。

如果有人能夠指出我在這里做錯了什么就會很棒!

好吧,您不需要編寫自己的Java文件。 聽起來像你做的那樣,錯誤就像它說的那樣 - Amount類不是IndexedRecord

例如,如果我采用您的架構並運行

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

然后看一下這個文件,我們看到它擴展了一些Avro java類。

$ 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插件指南記錄了以編程方式執行此操作的方法。

是的,Avro適用於嵌套記錄,我個人喜歡使用IDL來更輕松地創建它們

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

  record KafkaValue {
    Amount amount;
  }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM