我正在和Avro合作,我有一個GenericRecord
。我想從中提取clientId
,deviceName
,holder
。在Avro Schema中,clientId
是Integer,deviceName
是字符串,而holder
是Map。如何從GenericRecord獲取類型值?
{
"name" : "clientId",
"type" : [ "null", "int" ],
"doc" : "hello"
}
在Avro的模式deviceName
:
{
"name" : "deviceName",
"type" : [ "null", "string" ],
"doc" : "test"
}
在Avro的模式holder
:
在Avro的模式clientId
{
"name" : "holder",
"type" : {
"type" : "map",
"values" : "string"
}
}
我的問題是 - 什麼是推薦的方式來檢索一個類型值,而不是一個對象?
在下面的代碼中,是GenericRecord
,我們可以從它得到avro模式。這就是我現在正在做的事情,將所有內容解壓縮爲一個字符串。但是,我怎麼才能得到輸入值。有什麼辦法嗎?我的意思是無論avro模式中的數據類型是什麼,我只想提取它。
public static void getData(GenericRecord payload) {
String id = String.valueOf(payload.get("clientId"));
String name = String.valueOf(payload.get("deviceName"));
// not sure how to get maps here
}
所以我想提取clientId
爲整數,deviceName
string和holder
如Java地圖Map<String, String>
從GenericRecord
?什麼是最好的方式來做到這一點?我們可以編寫任何實用程序,它可以爲通用記錄和架構提供所有類型的轉換嗎?
你的三個'payload.get'調用返回什麼類型的對象? – qxz
@qxz的含義?我不明白。它將所有東西都作爲一個對象返回,然後你必須將它轉換成它的樣子。我想我們可以使用有效載荷的模式並編寫一些實用程序來轉換並返回結果。 – john
對於每一個,嘗試打印'payload.get(「...」)。getClass()。getCanonicalName()'查看對象的類型 – qxz