如何从 Avro 中的 GenericRecord 中提取输入的 Map?

use*_*349 3 java dictionary avro

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

 {
    "name" : "holder",
    "type" : {
      "type" : "map",
      "values" : "string"
    }
  }
Run Code Online (Sandbox Code Playgroud)

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

"holder": {
    "cossn": "0",
    "itwrqm": "20003"
}
Run Code Online (Sandbox Code Playgroud)

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

这个返回对象:

GenericRecord record = decoder.decode(data.value());    
Object holder = record.get("holder");
Run Code Online (Sandbox Code Playgroud)

这返回 Map 但我并没有真正看到它是键和值的映射。

GenericRecord record = decoder.decode(data.value());    
Map<String, String> holder = (Map<String, String>) record.get("holder");
Run Code Online (Sandbox Code Playgroud)

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

{cossn=0, itwrqm=200006033213}
Run Code Online (Sandbox Code Playgroud)

use*_*814 5

尝试使用

HashMap<Utf8, Utf8> holder = (HashMap<Utf8, Utf8>) record.get("holder");
Run Code Online (Sandbox Code Playgroud)

并通过以下方式访问您的持有人物品

String itwrqm = holder.get(new Utf8("itwrqm")).toString();
Run Code Online (Sandbox Code Playgroud)

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

{
"name" : "holder",
"type" : "type": {"type": "map", "values": {"type" : "string","avro.java.string": "String"},
         "avro.java.string":"String"} 
}
Run Code Online (Sandbox Code Playgroud)

有了这个模式,你可以使用 aHashMap<String,String>来获取你的持有者地图。请参阅Apache Avro:map 使用 CharSequence 作为键以获取更多说明。