【问题标题】:Setting Values in nested field in Avro Schema在 Avro Schema 的嵌套字段中设置值
【发布时间】:2018-02-06 13:19:06
【问题描述】:

我正在尝试使用 GenericData.Record 将 avro 数据生成到 kafka 中,但出现以下异常:

线程“main”org.apache.avro.AvroRuntimeException 中的异常:不是有效的架构字段:emailAddresses.email

这是我的架构:

{
 "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 记录中吗?

【问题讨论】:

    标签: java apache-kafka avro spark-avro


    【解决方案1】:

    您不能使用“.”设置内部值。因此,您必须手动创建内部对象(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);
    

    【讨论】:

    • 谢谢娜塔莉亚,它有效。你也知道我如何获得我在这里设置的记录。 GenericRecord 记录 = recordInjection.invert(avroRecord._2).get(); System.out.println("id= " + record.get("emailAddresses"));它给了我像 json 结构,但我想获得个人记录。
    • 我得到了答案 ((GenericRecord) record.get("emailAddresses")).get("email") 在这里工作。
    猜你喜欢
    • 2019-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-02
    • 1970-01-01
    • 2019-02-21
    • 1970-01-01
    • 2019-09-02
    相关资源
    最近更新 更多