我正在和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