加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – 如何从GenericRecord获取类型值?

发布时间:2020-12-15 02:57:46 所属栏目:Java 来源:网络整理
导读:我正在使用Avro,我有一个GenericRecord.我想从中提取clientId,deviceName,holder.在Avro Schema中,clientId是Integer,deviceName是String,holder是Map. avro架构中的clientId: { "name" : "clientId","type" : [ "null","int" ],"doc" : "hello"} avro架构
我正在使用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]>

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读