[英]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.