微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

我正在使用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]>

原文地址:https://www.jb51.cc/java/128353.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐