我正在使用Avro,我有一个GenericRecord.我想从中提取clientId,deviceName,holder.在Avro Schema中,clientId是Integer,deviceName是String,holder是Map.
avro架构中的clientId:
{ "name" : "clientId","type" : [ "null","int" ],"doc" : "hello" }
avro架构中的deviceName:
{ "name" : "deviceName","string" ],"doc" : "test" }
avro架构中的持有者:
{ "name" : "holder","type" : { "type" : "map","values" : "string" } }
我的问题是 – 与Object相反,检索类型值的推荐方法是什么?
在下面的代码中,有效负载是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提取为Integer,将deviceName提取为String,将holder提取为Java map Map< String,String>来自GenericRecord?最好的方法是什么?我们可以编写任何实用程序来执行通用记录和模式的所有类型转换吗?
解决方法
您应该能够将字符串值转换为Utf8,int转换为Integer,并映射到Map< Utf8,Utf8>.这应该不会导致ClassCastException:
public static void getData(GenericRecord payload) { int id = (Integer) payload.get("clientId"); String name = payload.get("deviceName").toString(); // calls Utf8.toString Map<Utf8,Utf8> holder = (Map<Utf8,Utf8>) payload.get("holder"); ... }
一般来说,我相信你可以做这些演员:
>原语成为他们的盒装版本(整数,双等)>字符串变为Utf8> bytes成为java.nio.ByteBuffer> array成为java.util.Collection> map成为java.util.Map< Utf8,[value type]>