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

在Avro架构的嵌套字段中设置值

米元凯
2023-03-14

我正在尝试使用GenericData将avro数据生成到Kafka中。记录,但我得到以下异常:

线程“main”组织中出现异常。阿帕奇。阿夫罗。AvroRuntimeException:不是有效的架构字段:emailAddresses。电子邮件

这是我的模式:

{
 "namespace": "com.cloudurable.User",

 "type": "record",

 "name": "User",

 "fields": [

     {"name": "id", "type": "int", "default" : 0},
     {"name": "fname",  "type": "string", "default" : "EMPTY"},
     {"name": "lname",  "type": "string", "default" : "EMPTY"},
     {"name": "phone_number",  "type": "string", "default" : "EMPTY"},
     {"name": "age",  "type": "int", "default" : 0},

     {
      "name": "emailAddresses",
      "type": {
          "type": "record",
          "name": "EmailAddress",
          "fields": [
            {
              "name": "email",
              "type": "string",
              "default" : "EMPTY"
            },
            {
              "name": "address",
              "type": "boolean",
              "default": false
            }
          ]
        }
    }
 ]
}

我的Java代码如下:

GenericData.Record avroRecord = new GenericData.Record(SchemaRegstryClient.getLatestSchema("test2"));
        System.out.println(avroRecord.getSchema().getFields());
        avroRecord.put("id", i);
        avroRecord.put("fName", "Sumit" + i);
        avroRecord.put("lName", "Gupta " +i);
        avroRecord.put("phone_number", "98911 " +i);
        avroRecord.put("age", i);
        avroRecord.put("emailAddresses.email", "sumit@gmail.com");
        avroRecord.put("emailAddresses.address", true);

有人知道如何在avro记录中放入嵌套值吗?

共有1个答案

范凡
2023-03-14

不能使用“.”设置内部值。因此,您必须手动创建内部对象(emailAddresses),并将其设置为顶级记录的字段。

final GenericData.Record emailAddresses = new GenericData.Record(schema.getField("emailAddresses").schema());
emailAddresses.put("email", "sumit@gmail.com");
emailAddresses.put("address", true);
avroRecord.put("emailAddresses", emailAddresses);
 类似资料:
  • 我想在下面的代码中设置值,我正在使用arraylist如何数据结构,我需要更改int值,它是最后一个值。我在其他类中使用了一个setter来更改这个值,但我尝试用 谢谢..

  • 问题内容: 假设我有一个像这样的领域模型: 现在,我可以像这样创建一个教师比较器: 但是,我如何像这样在嵌套字段上比较Lecture? 我无法在模型上添加方法。 问题答案: 您不能嵌套方法引用。您可以改用lambda表达式: 无需反向顺序,它就不再那么冗长了: 注意:在某些情况下,您需要明确声明泛型类型。对于 例如,下面的代码不会没有工作,之前在Java中8。 较新的Java版本具有更好的自动类型

  • Sup社区。我有个问题。我正在使用Elasticsearch 6.4 我的数据结构的一部分: 我需要得到按成本排序的文档desc,我需要排序dirs字段中的值date_by字段与nulls-first。 如何对嵌套字段内的值进行排序,而不按此嵌套字段对文档进行排序?

  • 在此avro模式中 当我试着给名字分配多个值,比如多个记录... 它总是为模式中的NAME字段指定Null...除了我放入的第一条记录...有没有方法可以将default用作字符串...如果没有字符串,那么它只使用模式中提到的Null 如上所述,联合是使用JSON数组表示的。例如,[“string”,“null”]声明一个模式,该模式既可以是字符串,也可以是null。 联合不能包含多个具有相同类型

  • 问题内容: 考虑一下这样的Elasticsearch中的文档: 我想搜索时不知道它是在文档的第一层还是第二层。这可能吗?还请记住,嵌套级别可以是任何东西(在开发时未知)。 如果可能的话,在不知道文档第二级中存在的情况下通过搜索返回该文档的查询是什么? 问题答案: 试试这个:

  • 这实际上与我之前的问题相同,但使用Avro而不是JSON作为数据格式。 我正在使用一个Spark数据框架,它可以从几个不同的模式版本之一加载数据: 我正在使用Spark Avro加载数据。 它可能是版本一文件或版本二文件。但是我希望能够以相同的方式处理它,将未知值设置为“null”。我之前的问题中的建议是设置模式,但是我不想重复自己在文件中编写模式,也不想重复自己在和朋友中编写模式。如何将avro