当前位置: 首页 > 知识库问答 >
问题:

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

诸正谊
2023-03-14

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

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

下面是holder map的数据:

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

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

此返回对象:

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

这返回一个Map,但我看不出它是一个键和值的Map。

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

当我打印持有者时,我看到这样的情况,这显然不是键/值的映射。我做错了什么?以及如何从GenericRecord中提取键入的映射?

{cossn=0, itwrqm=200006033213}

共有1个答案

商夜洛
2023-03-14

尝试使用

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"} 
}

有了这个模式,你可以使用哈希映射

 类似资料:
  • 问题内容: 给定GenericRecord,与对象相比,推荐的检索类型化值的方法是什么?我们是否应该强制转换值,如果是这样,从Avro类型到Java类型的映射是什么?例如,Avro Array == Java Collection ; 和Avro String == Java Utf8 。 由于每个GenericRecord都包含其架构,因此我希望找到一种类型安全的方法来检索值。 问题答案: 阿夫

  • 我使用Avro模式动态地从C#应用程序生成消息到Kafka集群,使用汇合的Kafka客户机。在编译时不知道数据类型,因此我使用命名空间中的GenericRecord类,如下所述:https://www.confluent.io/blog/decoupling-systems-with-apache-kafka-schema-registry-and-avro/。 但是,我有一个问题--如果模式有一

  • 给定GenericRecord,与对象相比,检索类型化值的推荐方法是什么?我们需要强制转换值吗?如果需要,从Avro类型到Java类型的映射是什么?例如,Avro数组==Java集合;和Avro String==Java UTF8。 由于每个GenericRecord都包含它的模式,所以我希望有一种类型安全的方法来检索值。

  • 问题内容: 我有一个代码可以使用功能将我的avro记录转换为Row 此功能不适用于嵌套模式。 谁能建议我如何将复杂的架构转换为ROW? 问题答案: 有,但是不幸的是私人的。有一些PR可以将其公开,但是它们从未合并: https://github.com/databricks/spark-avro/pull/89 https://github.com/databricks/spark-avro/pu

  • Avro SpecificRecord(即生成的java类)是否与模式演化兼容?一、 e.如果我有一个Avro消息源(在我的例子中是Kafka),并且我想将这些消息反序列化为特定的记录,那么这样做是否安全? 我所看到的: 将字段添加到架构的末尾效果很好-可以将ok反序列化为specificrecord 在中间添加字段不会破坏现有客户机 即使消息兼容,这也是一个问题。 如果我能找到新的模式(例如使用

  • 有没有办法将 GenericRecord(我刚刚从 Kafka 消息中得到的)反序列化为嵌套 POJO?我实际上正在将其反序列化为 Scala 的案例类,但我意识到这更难。我通过互联网搜索,似乎每个人都在手动进行。您知道任何能够做到这一点的库吗?