如何从Avro中的GenericRecord中提取类型的地图?

时间:2016-05-23 22:03:49

标签: java dictionary avro

我有一个通用记录,如下所示holder是一个值为字符串的地图。

 {
    "name" : "holder",
    "type" : {
      "type" : "map",
      "values" : "string"
    }
  }

以下是持有人地图的数据:

"holder": {
    "cossn": "0",
    "itwrqm": "20003"
}

我想在字符串和字符串的Map中提取持有者数据。我不知道我该怎么做?我尝试了两个选项,如下所示:

此返回对象:

GenericRecord record = decoder.decode(data.value());    
Object holder = record.get("holder");

这会返回地图,但我不会真正看到它是关键和价值的地图。

GenericRecord record = decoder.decode(data.value());    
Map<String, String> holder = (Map<String, String>) record.get("holder");

当我打印holder时,我看到这显然不是键/值的映射。我在做什么错了?以及如何提取从GenericRecord中输入的地图?

{cossn=0, itwrqm=200006033213}

1 个答案:

答案 0 :(得分:2)

尝试使用

HashMap<Utf8, Utf8> holder = (HashMap<Utf8, Utf8>) record.get("holder");

并通过

访问您的持有人项目
String itwrqm = holder.get(new Utf8("itwrqm")).toString();

Avro在内部使用Utf8 Class进行字符串表示。 另一种解决方法是更改​​Schema以支持Avro中的Java String表示:

{
"name" : "holder",
"type" : "type": {"type": "map", "values": {"type" : "string","avro.java.string": "String"},
         "avro.java.string":"String"} 
}

使用该架构,您可以使用HashMap<String,String>获取持有人地图。 有关详细说明,请参阅Apache Avro: map uses CharSequence as key