java - 如何从 Avro 的 GenericRecord 中提取类型的 map ?

标签 java dictionary avro

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

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

下面是holder map的数据:

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

我想在 String 和 String 的 Map 中提取持有人数据。我不确定我该怎么做?我尝试了两个选项,如下所示:

这个返回对象:

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

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

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

当我打印 holder 时,我看到的是这样,这显然不是键/值映射。我做错了什么?以及如何从 GenericRecord 中提取类型化的 map ?

{cossn=0, itwrqm=200006033213}

最佳答案

尝试使用

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

并通过

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

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

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

使用该架构,您可以使用 HashMap<String,String>获取您的持有人 map 。 参见 Apache Avro: map uses CharSequence as key获取进一步说明。

关于java - 如何从 Avro 的 GenericRecord 中提取类型的 map ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37401307/

相关文章:

hadoop - 无论如何要比较两个 avro 文件以查看数据中存在哪些差异?

json - 如何创建 Avro 架构?

java - 使用 Java 构建插件系统的最佳方法

java - 如何从其他项目中存在的类文件获取输入流

JAVA:创建 boolean 变量或在 If 语句中放置参数?

c# - 更改部分用户的团队

r - 如何使用 purrr 和 Pipes 顺序应用函数

c# - 在c#和java套接字之间读写数据

java - hibernate:三元关联映射

hadoop - AVRO 文件上的 Hive 外部表仅为所有列生成 NULL 数据