我有一个通用记录,如下所示,其中持有者
是一个值为字符串的映射。
{
"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}
尝试使用
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 的案例类,但我意识到这更难。我通过互联网搜索,似乎每个人都在手动进行。您知道任何能够做到这一点的库吗?